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

来源:互联网 发布:java redis订单减库存 编辑:程序博客网 时间:2024/05/01 06:06

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


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


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


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public Handler() {
    this(nullfalse);
}
 
public Handler(Looper looper) {
    this(looper, nullfalse);
}
 
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了:


1
2
3
4
5
6
7
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了。


到此为止,这个问题算是回答清楚了,但是关于Handler的解释还不够尽兴,比如线程的Looper到底是怎么工作的?下一篇文章,我将用Java的Thread类,实现一个类似Looper的消息循环,以便更好地显示Android的消息循环机制。本文有任何疑问或者不清楚的地方,欢迎留言或者来信lujun.hust@gmail.com交流,或者关注我的新浪微博 @卢_俊获取最新的文章和资讯。


本文出自 “Jhuster的专栏” 博客,请务必保留此出处http://ticktick.blog.51cto.com/823160/1564550

阅读全文
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 坐式马桶堵了怎么办 电动修眉刀钝了怎么办 眉毛自己修坏了怎么办 旋耕机旋的太深怎么办 摩拜单车忘了锁怎么办 胶棒没有胶枪怎么办 催泪喷雾被喷了怎么办 中了防狼喷雾怎么办 防狼喷雾喷脸上怎么办 高帮足球鞋难穿怎么办 水氟含量太高怎么办 买的自慰器太大怎么办 电棍充电器丢了怎么办 电动车连电了怎么办啊 鼻子两侧红是怎么办啊 自控力差的孩子怎么办 衣服肩膀破了洞怎么办 衣服烧了个洞怎么办 出满月黄疸没退怎么办 满月后黄疸还高怎么办 月子里的宝宝吐奶怎么办 刚满月的宝宝有点咳嗽怎么办 刚满月的咳嗽了怎么办 实木家具烫白了怎么办 木桌子烫白了怎么办 毛孔粗皮肤暗黄怎么办 脖子往右转就疼怎么办 夏天晚上热的睡不着怎么办 膝盖凉着了疼怎么办 打篮球手肿了怎么办呢 手被篮球戳肿了怎么办 手指被篮球砸了怎么办 走路久了膝盖疼怎么办 路走太多膝盖痛怎么办 走一天路膝盖疼怎么办 走多了膝盖胀痛怎么办 跑步多了膝盖疼怎么办 跑步跑得膝盖疼怎么办 脚打球崴脚淤血怎么办 打球歪了脚肿了怎么办 打球脚踝扭伤肿了怎么办