上一篇我们介绍了Handler 我们知道了一般的工作线程在默认情况下是没有消息处理能力的,如果要处理消息需要通过如下的代码来给普通的线程创建一个Looper。
class NonMainThread extends Thread { public Handler mHandler; public void run() { Looper .prepare(); mHandler = new Handler () { public void handleMessage(Message msg) { } }; Looper .loop(); } }
这个看上去不是很复杂,但是Android为我们提供了更为简单的实现方式–HandlerThread 首先我们还是先来看下它的使用方式:
mHandlerThread = new HandlerThread("WorkThread" ) ; mHandlerThread.start() ; mThreadHandler = new Handler(mHandlerThread .getLooper () ) { @Override public void handleMessage(Message msg ) { super.handleMessage(msg ) ; } };
我们接下来就来分析下这个过程:
首先在构造方法中接受一个参数为这个HandlerThread的名字,接着为我们的线程设置一个默认的优先级。
public HandlerThread (String name) { super (name); mPriority = Process .THREAD_PRIORITY_DEFAULT; }
如果不想使用默认的优先级可以使用下面的构造方法:
public HandlerThread (String name, int priority) { super (name); mPriority = priority; }
紧接着在调用start方法后,run方法将会运行:
@Override public void run() { mTid = Process . myTid() ; Looper . prepare() ; synchronized (this) { mLooper = Looper . myLooper() ; notifyAll() ; } Process . setThreadPriority(mPriority ) ; onLooperPrepared() ; Looper . loop() ; mTid = -1 ; }
这段代码很熟悉吧,其实该博客开头提到的那个代码,这里需要注意的是onLooperPrepared()这个方法是空的,我们如果需要在Looper循环开始前做些其他处理可以覆写这个方法。
接下来我们就可以调用getLooper方法返回已经处于loop状态的Looper了,也有了MessageQueue,就可以创建Handler处理其他线程发过来的消息了,注意的是这里是为了让非UI线程拥有处理其他线程发送过来消息能力才使用HandlerThread的,如果只需要具有消息发送的能力就不需要了,这个一定要清楚。
public Looper getLooper() { if (!isAlive()) { return null ; } synchronized (this ) { while (isAlive() && mLooper == null ) { try { wait(); } catch (InterruptedException e) { } } } return mLooper; }