爱程序网

Handler的post方法

来源: 阅读:

Handler的post(Runnable r)方法使用举例

根据解释可知Handler的post方法的参数是Runnable对象,将此对象添加到消息队列中去,Runnable对象运行在Handler依附的线程里

 

由于Handler对象生成于MainThread中,所以与Handler对象对应的Looper对象也生成于MainThread中,Runnable对象存放在消息队列中,MainThread中的Looper将Runnable对象取出来做了些什么?

猜测:生成线程对象,将Runnable对象作为线程体传入,并调用start方法

但根据显示可知,Runnable对象运行在MainThread中!猜测不正确

通过查看Handler的post方法源代码可知

getPostMessage方法生成Message对象,并将Runnable对象赋值给Message对象的callback属性

sendMessageDelayed方法用于发送Message对象,并设置延迟发送时间

其实post方法是把Runnable对象放入Message对象的callback属性中,然后再把Message对象放入消息队列中,那Looper取出了携带Runnable对象的Message对象做了哪些操作呢?

通过查看Looper的loop方法可知,会调用msg.target.dispatchMessage方法

当callback属性不为空时,调用handleCallback方法

message.callback.run(); 即Runnable.run();

直接调用Runnable的run方法是不会新开线程的,而是在原有线程中执行,所以会打印出当前线程是Main。根据这机制,我们可以直接在Runnable的run方法中定义更新MainThread的代码,然后调用Handler的post方法发送出去

关于爱程序网 - 联系我们 - 广告服务 - 友情链接 - 网站地图 - 版权声明 - 人才招聘 - 帮助