在Looper的源码中有段注释
* <pre> * class LooperThread extends Thread { * public Handler mHandler; * * public void run() { * Looper.prepare(); * * mHandler = new Handler() { * public void handleMessage(Message msg) { * // process incoming messages here * } * }; * * Looper.loop(); * } * }</pre> */
在工作线程中创建一个handler需要三步,第一步Looper.prepare(),第二步new一个Handler对象,第三步Looper.loop()。
每次开启工作线程用到Handler都需要做这几步操作,Android封装了一个HandlerThread来解决这一个繁琐工作,
首先HandlerThread两个含参构造方法,传入name,和优先级
public HandlerThread(String name) { super(name); mPriority = Process.THREAD_PRIORITY_DEFAULT; } public HandlerThread(String name, int priority) { super(name); mPriority = priority; }
它继承了Thread,在run方法中完成了Looper注释中的工作,
@Override public void run() { mTid = Process.myTid(); Looper.prepare(); synchronized (this) { mLooper = Looper.myLooper(); notifyAll(); } Process.setThreadPriority(mPriority); onLooperPrepared(); Looper.loop(); mTid = -1; }
对外提供了一个方法获取handler实例
@NonNull public Handler getThreadHandler() { if (mHandler == null) { mHandler = new Handler(getLooper()); } return mHandler; }
提供一个方法获取当前线程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; }
外部使用时可以自己new一个handler,并传入通过HandlerThread获取的Looper与线程绑定,例如IntentService中就是这么干的
HandlerThread thread = new HandlerThread("IntentService[" + mName + "]"); thread.start(); mServiceLooper = thread.getLooper(); mServiceHandler = new ServiceHandler(mServiceLooper);