在android面试中,我们常会遇到Framework面试相关问题,而今天要分享的就是Looper如何在子线程中创建?
其主要考察的是程序员对 Looper 的理解。
问题正解:
创建子线程的looper必须要通过Looper.prepare()初始化looper,然后再通过Looper.loop()方法让Loop运行起来。
那么具体的细节请看下面的说明:
Handler消息处理流程前面已经介绍过了,还不清楚的朋友,一定要先看下前面章节《Handler怎么进行线程通信,原理是什么》。 首先我们要知道Looper相关的几个重要方法:
Looper.prepare():Looper 初始化, 同时会初始化MessageQueue, Looper消息机制必须要初始化Looper。
Looper.myLooper(): 获取当前调用线程中ThreadLocal缓存的Looper对象。
Looper.loop():让Loop进入死循环。
getLooper(): Handler中的方法, 获取Handler中缓存的Looper对象。
Looper.quit(): 终止 Looper.looper() 死循环, 执行 quit后Handler机制将失效, 执行时如果MessageQueue中还有Message未执行, 将不会执行未执行Message, 直接退出, 调用quit后将不能发消息给Handler。
Looper.quitSafely(): 作用同 quit(), 但终止Looper之前会先执行完消息队列中所有非延时任务, 调用quit后将不能发消息给Handler。
子线程中使用Looper如下:
Handler mHandler;
new Thread(new Runnable() {
@Override
public void run() {
Looper.prepare();//Looper初始化
//Handler初始化 需要注意, Handler初始化传入Looper对象是子线程中缓存的Looper对象
mHandler = new Handler(Looper.myLooper());
Looper.loop();//死循环
//注意: Looper.loop()之后的位置代码在Looper退出之前不会执行,(并非永远不执行)
}
}).start();
其中主要需要注意的就是Handler的初始化,需要传入当前线程的 Looper 对象。然而,一般情况下我们并不会这样去给子线程创建looper,因为这样的方式只能创建一个handler对象。我们最正确的创建子线程 Looper的方法一般是调用HandlerThread。
今日分享到此结束,下期更精彩~
关注个人简介,面试不迷路~
网友评论