HandlerThread
使用场景:创建一个子线程用于处理耗时操作,创建完HandlerThread后可以用getLooper将其绑定的线程传给Handler,这样该Handler再处理消息时都会运行在这个线程上,优点在于可以不断使用,避免了频繁的创建新线程,使用方法在最底下。
官方Doc API 27
Handy class for starting a new thread that has a looper. The looper can then be used to create handler classes. Note that start() must still be called.
开启一个有Looper的线程,需要调用start()
方法
构造方法
/**
* Constructs a HandlerThread.
* @param 线程名称
* @param priority 运行Thread的优先级,值必须来自 {@link android.os.Process}
* 而不是Java的Thread类
*/
public HandlerThread(String name, int priority) {
super(name);
mPriority = priority;
}
public HandlerThread(String name, int priority) {
super(name);
mPriority = priority;
}
关于Priority,这个和Linux系统进程的优先级相关,这里不要使用Thread类里面的优先级,要使用Android的Process类里面的,而且这里的优先级不要设置给Thread,只能设置给Process。
优先级分很多,默认是0,可以为负,值越小代表优先级越高。
方法:
- onLooperPrepared()
protected void onLooperPrepared() {
...
}
留给子类重写,用于在Looper开始loop之前做一些初始化工作
- run()
@Override
public void run() {
mTid = Process.myTid();
Looper.prepare();
synchronized (this) {
mLooper = Looper.myLooper();
notifyAll();
}
Process.setThreadPriority(mPriority);
onLooperPrepared();
Looper.loop();
mTid = -1;
}
调用start后这里便会开始执行,在这个线程绑定一个Looper
- getLooper()
/**
* 返回线程绑定的Looper,如果线程还没调用start,或者因为其他原因
* isAlive()返回false,这个方法会返回空。如果这个线程已经start了,
* 阻塞到Looper初始化成功为止。
*/
public Looper getLooper() {
...
return mLooper;
}
用于返回这个线程绑定的Looper,用这个Looper创建绑定的Handler,操作也会执行在这个线程上
- getThreadHandler()
返回线程绑定的Handler,已被隐藏,不再使用 - quit() 立刻退出looper,已退出返回true
- quitSafely() 等到剩下的消息都处理完了再退出looper,已退出返回true
public boolean quitSafely() {
Looper looper = getLooper();
if (looper != null) {
looper.quitSafely();
return true;
}
return false;
}
使用方法
HandlerThread handlerThread;
Handler handler;
private void initHandler() {
handlerThread = new HandlerThread("MyThread");
handlerThread.start();
handler = new Handler(handlerThread.getLooper());
handler.post(new Runnable() {
@Override
public void run() {
...
}
});
}