您的位置:首页 > 产品设计 > UI/UE

android 子线程真的不能更新ui吗

2015-06-29 02:06 621 查看
在实际的开发中,子线程肯定是不能更新ui的,但是在测试的代码中,我们可以实现子线程中更新ui的功能,例如:一个textview 在oncreate生命周期方法中进行findviewbyid

然后紧接着写一个线程,在线程中直接对这个textview进行settext,你就会发现奇迹竟然就那么发生了,竟然真的更新了ui,而app竟然没有cresh掉,顿时就惊呆了

然后分别尝试在onstart onresume 方法中进行子线程更新ui的操作,竟然都可以更新,但是此时有一个地方需要注意,当我们程序的onresume生命周期方法执行完毕之后,此时再在子线程中更新ui就会报错,例如,在一个button的点击事件中更新ui,此时onresume肯定已经执行完毕,这个时候肯定是会报错的.原因是在第一次的oncreate onstart onresume 生命方法中.activity的rootviewimpl还没有创建出来.这个时候进行更新ui是没有问题的.但是当rootviewimpl创建出来之后,就不能再在子线程中更新ui了.所以说子线程中更新ui的方式在实际的开发中完全用不到.关键时刻还是要用thread
hanler的方式进行ui的更新


下面是示例程序:

activity:

package com.example.testchildthreadgootheractivity;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity {

private Context context;
private TextView tv_result;
private Button btn_refresh;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
context = this;
initVeiw();
Log.e("test", "main thread,name:" + Thread.currentThread().getName()
+ ",id:" + Thread.currentThread().getId());

new Thread(new Runnable() {
@Override
public void run() {
Log.e("test", "child thread,name:" + Thread.currentThread().getName()
+ ",id:" + Thread.currentThread().getId());
tv_result.setText("oncreate refresh textview");
}
}).start();

}

@Override
protected void onStart() {
super.onStart();
new Thread(new Runnable() {
@Override
public void run() {
Log.e("test", "child thread,name:" + Thread.currentThread().getName()
+ ",id:" + Thread.currentThread().getId());
tv_result.setText("onstart refresh textview");
}
}).start();
}

@Override
protected void onResume() {
super.onResume();
new Thread(new Runnable() {
@Override
public void run() {
Log.e("test", "child thread,name:" + Thread.currentThread().getName()
+ ",id:" + Thread.currentThread().getId());
tv_result.setText("onresume refresh textview");
}
}).start();
}

private void initVeiw() {
tv_result = (TextView) findViewById(R.id.tv_result);
btn_refresh = (Button) findViewById(R.id.btn_refresh);

btn_refresh.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
new Thread(new Runnable() {
@Override
public void run() {
Log.e("test", "child thread,name:" + Thread.currentThread().getName()
+ ",id:" + Thread.currentThread().getId());
tv_result.setText("onresume refresh textview");
}
}).start();
}
});
}

@Override
protected void onPause() {
super.onPause();
Log.e("test", "onPause");
}

@Override
protected void onStop() {
super.onStop();
Log.e("test", "onStop");
}

@Override
protected void onDestroy() {
super.onDestroy();
Log.e("test", "onDestroy");
}

@Override
protected void onRestart() {
super.onRestart();
Log.e("test", "onRestart");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: