上一篇我们介绍了Handler 我们知道了一般的工作线程在默认情况下是没有消息处理能力的,如果要处理消息需要通过如下的代码来给普通的线程创建一个Looper。

class NonMainThread extends Thread {
public Handler mHandler;
public void run() {
Looper.prepare();
mHandler = new Handler() {
public void handleMessage(Message msg) {
// process incoming messages here
}
};
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;
}

// 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;
}
Contents