Android(安卓)HandlerThread源码解析
16lz
2021-01-25
作为Android开发者都知道在子线程中使用Handler必须要创建Looper,其实HandlerThread就是在线程中封装了Looper的创建和循环,不用我们开发者自己去创建它,下面我们来看看源码
源码
public class HandlerThread extends Thread { int mPriority; int mTid = -1; Looper mLooper; public HandlerThread(String name) { super(name); mPriority = Process.THREAD_PRIORITY_DEFAULT; } /** * Constructs a HandlerThread. * @param name * @param priority The priority to run the thread at. The value supplied must be from * {@link android.os.Process} and not from java.lang.Thread. */ public HandlerThread(String name, int priority) { super(name); mPriority = priority; } /** * Call back method that can be explicitly overridden if needed to execute some * setup before Looper loops. */ protected void onLooperPrepared() { } @Override public void run() { mTid = Process.myTid(); Looper.prepare(); synchronized (this) { mLooper = Looper.myLooper(); notifyAll(); } Process.setThreadPriority(mPriority); onLooperPrepared(); Looper.loop(); mTid = -1; }
可以看出它就是一个普通的线程,创建的时候设置优先级,我们来看看它的run方法,挑重点看
//创建looper,保存到ThreadLocal线程中 Looper.prepare(); synchronized (this) { //得到创建的Looper mLooper = Looper.myLooper(); notifyAll(); } Process.setThreadPriority(mPriority); onLooperPrepared(); //启动循环Looper中的消息队列 Looper.loop();
很简单,就是创建了Looper并且启动循环消息队列。
public Looper getLooper() { if (!isAlive()) { return null; } // If the thread has been started, wait until the looper has been created. synchronized (this) { while (isAlive() && mLooper == null) { try { wait(); } catch (InterruptedException e) { } } } return mLooper; }
得到刚才创建的Looper对象。
public boolean quit() { Looper looper = getLooper(); if (looper != null) { looper.quit(); return true; } return false; }
释放Looper消息队列里的消息。
到此HandlerThread的源码就解析完了。
更多相关文章
- Android之智能问答机器人
- Android(安卓)开机自启动应用
- 【OkHttp3源代码分析】(一)Request的execute
- Android中使用Timer配合postInvalidate()刷新View
- android Handler消息处理源码剖析
- Android:ThreadLearning1
- Android-SurfaceView示例
- Handler的理解
- 线程池工具类