handler用来处理异步通信,主要有两个方法,
1.post(Runnable r) 其实post方法最终也是调用sendMessage方法
2.sendMessage(Message msg);
查看源码可知,sendMessage内部是调用sendMessageAtTime这个方法,如下:
public boolean sendMessageAtTime(Message msg, long uptimeMillis)
{
boolean sent = false;
MessageQueue queue = mQueue;
if (queue != null) {
msg.target = this;
sent = queue.enqueueMessage(msg, uptimeMillis);
}
else {
RuntimeException e = new RuntimeException(
this + " sendMessageAtTime() called with no mQueue");
Log.w("Looper", e.getMessage(), e);
}
return sent;
}
当我们在主线程中创建两个Handler,比如Handler1和Handle2,在子线程中用Handler1发送消息,在主线程中只会有Handler1收到消息,因为由上面源码看出用msg.target = this;标记了使用的Handler,这个this就是我们发送消息的那个Handle。
一般我们在主线程中创建Handler,在子线程中发送消息,发送的消息会依次放入主线程中的消息队列MessageQueue中,而在主线程中有Looper方法(这是一个无限循环的方法,不断查询队列里面的消息whlie(true))里面,等待执行,所以如果在子线程中创建Handler是会报错的,因为传递不到Looper中,解决方案:
1.在子线程中自定义一个Looper
2.拿到主线程的Looper给Handler-------new Handle(Looper.getMainLooper)
网友评论