- handler中的looper如何与当前线程绑定
handler实例化的时候会构造对应该handler的looper和messageQueue,而当前线程的looper和messageQueue是在Looper.prepare方法中实例化并借助ThreadLocal.set方法与当前looper绑定到当前线程(当前线程就是调用Looper.prepare方法的线程)。
实例化looper时候已经将messageQueue实例化了。
主线程中生成handler时候为什么没有调用prepare()方法生成looper实例并将其绑定到当前线程?因为activityThread的main方法中已经生成了一个looper(Looper.prepareMainLooper()方法),然后通过Looper.loop()让这主线程循环调用起来。
-
handler如何往looper中存取消息?
sendMessage方法中进入enqueueMessage方法,然后通过msg.target = this;将handler和message进行绑定,最后能够将message加入到queue末尾。
获取message是通过Looper.loop()中无限循环获取queue的下一个message,直到queue为空,如果message不为空就调用msg.target.dispatchMessage(msg);这样就将message通过handler处理了。 -
无限循环中如何保证主线程不被卡死
线程默认没有Looper的,如果需要使用Handler就必须为线程创建Looper。我们经常提到的主线程,也叫UI线程,它就是ActivityThread,ActivityThread被创建时就会初始化Looper,这也是在主线程中默认可以使用Handler的原因。
Android中为什么主线程不会因为Looper.loop()里的死循环卡死? - Gityuan的回答 - 知乎 -
子线程中更新UI方式
1、在子线程中给Handler赋予looper,要知道当handler绑定了looper,其发送的message就是在looper对应的Thread中处理的。
2、调用runOnUIThread,内部机制和主线程handler一致
3、调用view.post方法,实现通过绑定了sMainLooper的handler
4、利用AsyncTask更新UI,也是通过handler,我裂开
网友评论