使用HandlerThread获取Looper对象,后创建Handler(mHandlerThread.getLooper),此时的HandleMessage()在子线程中运行,为何此处可以更新UI?
public class MainActivity extends AppCompatActivity {
private TextView mTvText ;
private Handler mHandler;
// 使用这个新线程获取Looper对象
private HandlerThread mHandlerThread = new HandlerThread("my_handler_thread");
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTvText = (TextView)findViewById(R.id.id_tv_text);
mHandlerThread.start();
mHandler = new Handler(mHandlerThread.getLooper()){
@Override
public void handleMessage(Message msg) {
// 此处显示在子线程中执行 handleMessage()
// 为何在此处(子线程中)更新UI组件不会抛出异常?
Log.v("LOG","CurThread: "+Thread.currentThread());
// CurThread:Thread[my_handler_thread,5,Main]
mTvText.setText("update this textView!");
}
};
mHandler.sendEmptyMessage(1);
}
}

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
并不是所有对
View的操作都认为是更新UI,更新UI主要可以通过这个操作内部是否调用了View.invalidate()来判断,也就是说,所谓的更新UI是指程序代码主动要求马上更新UI,这时候才会因为检查线程而出错。而类似
TextView.setText()等一些方法,虽然替换了显示内容,但内部没有马上申请UI更新,而只是进行一下标记,等到下次主线程更新UI时才会在主线程更新UI。在内部方法中,可以体现为使用View.invalidate()和View.postInvalidate()的区别。在主线程中更新的。
mhandler绑定了主线程(UI线程),你这个不就是一直都在主线程中实现更新吗?Android_Message_Handler_消息处理机制总结笔记Android在Activity中更新UI界面的时候都会通过ViewRootImpl.checkThread方法检查当前线程是不是主线程,如果不是主线程就会抛出此异常。