总是感觉 android 中 UI 更新很让人纠结!自己小结一下,算是抛砖引玉。
读这篇文章之前,假设你已经明白线程、Handler 的使用。
在文章的最后,附录一张草图,主要用于说明 Handler、Message、MessageQueue、Looper 之间的关系。
1. 在 onCreate() 方法中开启线程更新 UI
public class MasterActivity extends Activity {
TextView tv = null; Button btn = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
System.out.println(Thread.currentThread().getName() + ": " + Thread.currentThread().getId());
tv = (TextView)findViewById(R.id.text);
btn = (Button)findViewById(R.id.btn); /*onCreate中开启新线程,更新UI。没有报错或者异常信息!*/
Thread thread = new Thread(new Runnable() {
@Override public void run() {
System.out.println(Thread.currentThread().getName() + ": " + Thread.currentThread().getId());
tv.setText("update UI is success!");
btn.setText("update UI is success!");
}
});
thread.start();
}
随便折腾,不会报错或者异常!
以为开启的线程和 UI 线程(主线程)是同一个线程,但是很不幸,他们的线程id根本是风牛马不相及!
大家可以跟踪一下android 源码,这个主要是因为在加载 Activity 的时候,还没有触发检查单线程的模型(即子线程不可以更新ui)。
如果你不相信的话,可以在上面的线程里面 `while true`,那么一定会报错的。
2. 在 activity 如 onResume、onStart、反正是以 on 开头的回调方法
@Override
protected void onRestart() {
super.onRestart(); /*onRestart中开启新线程,更新UI*/
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + ": " + Thread.currentThread().getId());
tv.setText("update UI