HandlerThread总结
Posted Alex_MaHao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HandlerThread总结相关的知识,希望对你有一定的参考价值。
概述
在android
中,如果子线程想主线程发消息,可以通过handler
。而主线程想往子线程发消息,需要子线程调用Loop.prepare() & Loop.loop()
。这是由于handler
的使用依赖Loop
,而在主线程中,默认已经进行了Loop
的初始化工作,并保存到了主线程里,子线程并没有。
有一种简单的方式,便是通过HandlerThread
,他内部维护了一个消息队列,并在子线程运行,能够便捷的完成异步任务。
具体使用
// 步骤1:创建HandlerThread实例对象
// 传入参数 = 线程名字,作用 = 标记该线程
HandlerThread mHandlerThread = new HandlerThread("handlerThread");
// 步骤2:启动线程
// 此时mHandler中维护了一个消息队列,对应任务依次执行。参考主线程handler逻辑
mHandlerThread.start();
// 步骤3:创建工作线程Handler 注意参数,一定要绑定对应的消息队列
Handler workHandler = new Handler(mHandlerThread.getLooper();
// 步骤4:执行异步任务
workHandler.post(new Runnable()
@Override
public void run()
// 该方法会在子线程执行
);
// 步骤5:结束线程,即停止线程的消息循环
mHandlerThread.quit();
原理分析
实质:HandlerThread
创建维护了一个子线程,并在初始化时启动当前子线程的Looper
对象。
public class HandlerThread extends Thread
启动时
@Override
public void run()
mTid = Process.myTid();
Looper.prepare();
synchronized (this)
mLooper = Looper.myLooper();
notifyAll();
Process.setThreadPriority(mPriority);
onLooperPrepared();
Looper.loop();
mTid = -1;
注意
HandlerThread
构造的消息队列,是单线程的。即同时post()
多次,会按照调用顺序依次执行
以上是关于HandlerThread总结的主要内容,如果未能解决你的问题,请参考以下文章
Handler,Looper,HandlerThread浅析