足以应对面试的一篇Handler

第一:简单的简述Handler与Looper与MessageQueue整体运作

Handler:用于处理Message,可以有多个实例
Message:用于线程之间传递信息,发送的信息放入MessageQueue中
MessageQueue:是一个消息队列,用来存储Message信息,每个线程只有一个实例。
Looper:每个线程只有一个Looper,他是一个无限循环,不断地从MessageQueue中取出Message,发给handler处理
第二:如何在子线程中创建Handler
首先明白在子线程中通过 Handler handler = new Hander()
创建Handler 会出异常
原因:
因为每个Handler 和 Looper 是绑定的,在Ui线程中,当程序启动的时候就会去创建一个Looper
解决办法:
class LooperThread extends Thread
{
public void run()
{
Looper.prepare();
Handler mHandler= new Hander()
int what = 0;
mHandler.sendEmptyMessage(what);
Looper.loop();
}
}
第三问:Looper.prepare();创建新的Looper和UI线程的Looper 是不是一个Looper
答:同时Looper ——一个线程只有一个,那么子线程的looper 和 主线程的looper 是两个looper
第四问:MessageQueue是一个消息队列的实现方式
答:它的底层实现是一个单链表,插入位置取决于当前插入信息的等待时间
第五问:那么Handler内部如何获取到当前线程的Looper呢?
答:这就要使用ThreadLocal了,ThreadLocal可以在不同的线程之中互不干扰地存储并提供数据,通过ThreadLocal可以轻松获取每个线程的Looper。当然需要注意的是,线程是默认没有Looper的,如果需要使用Handler就必须为线程创建Looper。大家经常提到的主线程,也叫UI线程,它就是ActivityThread,ActivityThread被创建时就会初始化Looper,这也是在主线程中默认可以使用Handler的原因。
第六:主线程中的Looper.loop()一直无限循环为什么不会造成ANR?

https://www.jianshu.com/p/cfe50b8b0a41
最后一副简单的 消息机制流程图
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值