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方法发送出去