HandleThread集成Thread,它是一种可以使用handle的Thread,它在run方法中通过Looper.prepare()来创建一个消息队列,并通过Looper.loop(),来开启消息循环。
@Override
public void run() {
mTid = Process.myTid();
Looper.prepare();
synchronized (this) {
mLooper = Looper.myLooper();
notifyAll();
}
Process.setThreadPriority(mPriority);
onLooperPrepared();
Looper.loop();
mTid = -1;
}
HandleThread与普通Thread的不同之处,普通Thread是在run方法中执行耗时操作,而HandleThread创建了消息队列,外界可以通过Handle的消息方式执行一个具体的任务。HandleThread的run方法是一个无限循环,当不需要使用时,可以通过quit或者quitSafely来终止程序的执行。
HandleThread的使用场景以及好处:
1.在需要重复使用子线程处理任务时,可以使用HandlerThread,它自带Looper使他可以通过消息来多次重复使用当前线程,节省开支,如果在开发中多次使用类似new Thread(){…}.start(),这种方式开启一个子线程,会创建多个匿名线程,使得程序运行变慢。
2.在非UI线程使用消息机制,可以使用HandlerThread,它不会干扰或阻塞UI线程(android系统提供的Handler类内部的Looper默认绑定的是UI线程的消息队列)
HandleThread的具体应用场景体现在IntentService中,可以参照我的下一篇文章IntentService,这里简单的写一个使用的例子,基本可以安照UI线程的Handle的使用方法使用:
public class HandleThreadActivity extends Activity {
private static final String Tag = "HandleThreadActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
HandlerThread mHandlerThread = new HandlerThread("test");
mHandlerThread.start();
Looper mLooper = mHandlerThread.getLooper();
Handler mHandler = new Handler(mLooper) {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
int value = msg.what;
Log.i(Tag, "value====" + value);
}
};
mHandler.sendEmptyMessage(2);
}
}