前两篇附带了一些源码讲述了handler的使用过程,相信大家都会觉得handler使用还是很方便的。这里要再介绍一个类:HandleThread类,该类继承自Thread类,与handler结合使用,使在子线程中处理消息更为便利。话不多说,先来介绍一下HandleThread的使用。
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
HandlerThread handleThread = new HandlerThread("thread_1"); // 传入的参数表示新线程命名为“"thread_1"”
handleThread.start(); // 开启新线程,这一步少不了
final Handler handler = new Handler(handleThread.getLooper()){ // 将handler与新线程的Looper绑定,不传参数会默认绑定当前线程(这里是主线程)的Looper
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
// 添加自己的代码,处理业务
}
};
handler.sendEmptyMessage(0); // 在主线程中发送消息
new Thread(new Runnable() {
@Override
public void run() {
handler.sendEmptyMessage(1); // 在子线程中发送消息
}
}).start();
}
@Override
protected void onDestroy() {
super.onDestroy();
handleThread.quit(); // activity结束时退出looper
}
上面就是HandleThread的使用,与之前我们讲handler使用对比,区别在我们不需要去调用Looper.prepare()和looper.loop()方法,因为handleThread已经帮我们做了。下面简单展示一下handleThread的源码部分。
public class HandlerThread extends Thread { // handlerThread 继承自Thread类
int mPriority;
int mTid = -1;
Looper mLooper;
private @Nullable Handler mHandler;
public HandlerThread(String name) {
super(name);
mPriority = Process.THREAD_PRIORITY_DEFAULT;
}
@Override
public void run() { // 覆写了Thread类的run方法
mTid = Process.myTid();
Looper.prepare(); // 获取一个Looper
synchronized (this) {
mLooper = Looper.myLooper();
notifyAll();
}
Process.setThreadPriority(mPriority);
onLooperPrepared();
Looper.loop(); // 开启消息循环
mTid = -1;
}
上面可以看出,HandleThread类继承自Thread类,覆写了run方法,在此方法中,帮我们创建Looper对象,并且开启loop循环消息队列,所以使用时,start方法一定要记得调用!
public boolean quit() { // 退出消息队列循环
Looper looper = getLooper();
if (looper != null) {
looper.quit(); // 调用looper的方法退出
return true;
}
return false;
}
以上就是handlerThread的一些介绍,总体来说还是比较简单的。
本人是2017年刚出校门,毕业后才开始从事安卓开发,android和java有很多东西没搞清楚,说的不对的地方欢迎大家指正出来,一起学习,共同进步,也欢迎大家与我微信交流(微信号:zhfwwx)。