探索在onCreate()中开启工作线程更新UI,不报错的原因:
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class MainActivity extends Activity {
private TextView mNameTV;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mNameTV = (TextView) findViewById(R.id.tv_name);
mNameTV.setText("我是在UI线程更新UI");
new Thread(new Runnable() {
public void run() {
mNameTV.setText("我是在非UI线程更新UI");
}
}).start();
}
}
在android中界面的UI更新这个过程是没有加锁的.所以是不能用非UI线程去更新UI.在android的系统设计中用ViewRootImp去检查是当前更新UI的线程是否是UI线程,如果不是会抛出异常.
ViewRootImpl 是隐藏类可.下载android5.0源码或者在http://grepcode.com/project/repository.grepcode.com/java/ext/com.google.android/android/中去查找.截取源码如下:
public final class
void checkThread() {
if (mThread != Thread.currentThread()) {
throw new CalledFromWrongThreadException(
"Only the original thread that created a view hierarchy can touch its views.");
}
}
继续深究我们会发现ViewRootImp是在Activity.onResume()后才创建的.所以上面的demo,在onCreate()中在子线程更新UI可以正常运行而不会报错.
若读者对以上博文有更好的理解与建议.欢迎联系本人斧正.
QQ:409653786.