1.Handler
Handler会关联一个单独的线程和消息队列。Handler默认关联主线程,虽然要提供Runnable参数 ,但默认是直接调用Runnable中的run()方法。也就是默认下会在主线程执行,如果在这里面的操作会有阻塞,界面也会卡住。如果要在其他线程执行,可以使用HandlerThread
注:handler只能在带有looper的线程中创建,一般的线程是不带looper的,想要让线程具有looper,需调用Looper.prepare()创建,所以handler不能在子线程中创建。
2.HandlerThread
HandlerThread继承于Thread,所以它本质就是个Thread。与普通Thread的差别就在于,它有个Looper成员变量。这个Looper其实就是对消息队列以及队列处理逻辑的封装,简单说就是 消息队列+消息循环。
当我们需要一个工作者线程,而不是把它当作一次性消耗品,用过即废弃的话,就可以使用它
public class WorkThreadHandler {
private static final String TAG = "WorkThreadHandler";
private HandlerThread mWorkThread;
private Handler mWorkHandler;
public WorkThreadHandler(int priority) {
mWorkThread = new HandlerThread(TAG, priority);//创建一个HandlerThread,参数priority必须来自于android.os.Process
mWorkThread.start();//启动工作线程
mWorkHandler = new Handler(mWorkThread.getLooper());//创建工作线程的handler
}
public boolean isRelease() {
if (mWorkThread == null || mWorkHandler == null) {
return true;
}
return false;
}
public void release() {
if (mWorkThread != null) {
mWorkHandler.removeCallbacksAndMessages(null);
Looper looper = mWorkThread.getLooper();
if (looper != null) {
looper.quit();
}
}
mWorkThread = null;
mWorkHandler = null;
}
public void postTask(Runnable task) {
if (mWorkHandler != null) {
mWorkHandler.post(task);//通过handler post任务,让工作线程执行我们的task,上层可通过mWorkThreadHandler.postTask方式使用本类
}
}
public void postTaskDelayed(Runnable task, long delay) {
if (mWorkHandler != null) {
mWorkHandler.postDelayed(task, delay);
}
}
public void postTaskAtTime(Runnable task, long when) {
if (mWorkHandler != null) {
mWorkHandler.postAtTime(task, when);
}
}
public void postTaskAtFront(Runnable task) {
if (mWorkHandler != null) {
mWorkHandler.postAtFrontOfQueue(task);
}
}
public void removeTask(Runnable task) {
if (mWorkHandler != null) {
mWorkHandler.removeCallbacks(task);
}
}
}