Handler

作者: 魂之挽歌w | 来源:发表于2017-12-12 21:48 被阅读5次

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)

相关文章

网友评论

      本文标题:Handler

      本文链接:https://www.haomeiwen.com/subject/dnhoixtx.html