设为首页 加入收藏

TOP

Android开发实践:由new Handler()说开去
2015-02-02 14:37:52 来源: 作者: 【 】 浏览:10
Tags:Android 开发 实践 new Handler 开去

(1) Service与Thread有什么区别?


(2) 在Activity里new Handler()和在自己创建的Thread中new Handler()有什么区别?


第二个问题,涉及到Android开发必须掌握的知识点:Handler,本文就来从这个问题开始,说说我对Handler的理解。


当Android应用启动后,系统会默认创建一个主线程(Main thread)。这个主线程启动后,首先完成UI的绘制,然后会进入一个消息循环(Loop),等待和执行各种来自系统的消息和事件、各种用户点击/触摸事件、其他线程发送的消息事件等等。这是线程工作的一种常见的模式,即进入一种“等待命令”->“执行命令/消息”->“等待命令/消息”的循环。


那么,其他非UI线程如何与进入了消息循环的主线程交互呢?这就得靠Handler了。


Handler是Android系统为工作线程提供的一种可以与外界交互的接口,通过Handler提供的sendMessage()方法,外界可以发送各种消息事件给工作线程。Handler通过构造函数完成与指定线程的绑定,其构造函数定义如下:


public Handler() {


? ? this(null, false);


}


?


public Handler(Looper looper) {


? ? this(looper, null, false);


}


?


public Handler(Looper looper, Callback callback) {


? ? this(looper, callback, false);


}


?


public interface Callback {


? ? public boolean handleMessage(Message msg);


}


其中,Looper就是线程内部负责实现消息循环的对象,普通的Java.Thread线程内部是没有这样一个消息循环对象的,Android专门提供了HandlerThread封装这种带消息循环机制的线程。Handler通过与线程的Looper对象绑定,来完成与该Thread的绑定。


Callback则是由工作线程内部传出接收到的消息的回调接口,其他线程通过Handler的sendMessage发送消息给工作线程后,工作线程就会通过Callback将接收到的消息通知给监听者。


注意:默认情况下,如果new Handler()的时候,没有传入某个线程的Looper对象(或传入null),系统就会默认绑定到创建Handler()对象的线程中。


那么,现在可以回答第二个问题了,在Activity里new Handler()和在自己创建的Thread中new Handler()有什么区别?


答案:


Activiy默认是工作在主线程中的,所以在Activity中new Handler()后,该Handler对象默认绑定了主线程的Looper对象,因此该Handler.sendMessage消息发送给了主线程,而且通过传入Callback对象得到的handleMessage()回调也是工作在主线程,这就是为什么可以通过在Activity里使用如下方式更新UI而不会导致ANR了:


new Handler( new Handler.Callback() {? ? ? ? ?


? ? @Override


? ? public boolean handleMessage(Message msg) {? ? ? ? ? ?


? ? ? ? UpdateUI();


? ? ? ? return false;


? ? }


});


同理,如果在自定义线程中 new Handler(),则默认情况该Handler()绑定了该线程的Looper对象,因此该Handler.sendMessage消息则是发送给了这个线程,而且通过传入Callback对象得到的handleMessage()回调也是工作在这个线程,因此,这种情况下的handleMessage()函数中就不能进行UI更新操作了,否则会导致ANR了。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Android开发实践:使用Service还.. 下一篇Android开发实践:自定义带消息循..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: