Android XHandler —极大方便UI线程和工作线程的切换
程序员文章站
2022-07-14 18:25:24
...
一、XHandler 功能介绍
XHandler是对Android Handler进行的扩展,不仅支持在UI主线程中进行消息的发送处理,还支持了在工作线程中进行消息的发送处理,工作线程采用线程池实现。并且可以很方便的在UI主线程和工作线程之前进行切换。解放UI主线程的微耗时操作,减少Android ANR,让APP更加流畅。
二、XHandler 使用讲解
(1)XHandler初始化
- 目前提供2中构造方法:
- 一种默认无参构造器;
- 另一种是传入Context参数,XHandler内部采用弱引用的方式(推荐使用)。
//第一种:默认无参构造器
private XHandler mXHandler = new XHandler();
//第二种传入context,XHandler内部采用弱引用的方式,推荐使用该构造方法
private XHandler mXHandler = new XHandler(this) {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
//该方法为处理UI主线程的消息
}
@Override
public void handleMessageOnWorker(Message msg) {
super.handleMessageOnWorker(msg);
//该方法为处理工作线程的消息
}
};
(2)XHandler发送消息到工作线程
- (1)XHandler中提供向工作线程发送消息的一组方法,方法名以**OnWorker结尾。
- 例如: mXHandler.postOnWorker(runnable)
- mXHandler.sendMessageOnWorker(msg)
- mXHandler.sendEmptyMessageOnWorker(0) 等。
- (a)XHandler从工作线程 ——> UI主线程
//在工作线程中执行
mXHandler.postOnWorker(new Runnable() {
@Override
public void run() {
//工作线程中执行,不影响UI线程
//如果工作线程中的耗时任务完成,此时想切换到UI主线程,怎么办???
//依然通过mXHandler来发送消息到UI主线程。使用Hander的原始消息发送方法。
mXHandler.sendEmptyMessage(MSG_02);
}
});
- (b)XHandler 从UI主线程 ——> 工作线程
//在UI线程中执行
mXHandler.post(new Runnable() {
@Override
public void run() {
//从主线程切换到工作线程中
mXHandler.sendEmptyMessageOnWorker(MSG_02);
}
});
(3)、XHandler消息处理
(a)UI主线程消息处理方法——handleMessage(msg)
(b)工作线程消息处理方法——handleMessageOnWorker(msg)
- 示例代码如下:
private XHandler mXHandler = new XHandler(this) {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case MSG_01:
Toast.makeText(MainActivity.this, "UI线程发送消息-toast", Toast.LENGTH_LONG).show();
break;
case MSG_02:
Toast.makeText(MainActivity.this, "工作线程切换到主线程的-toast", Toast.LENGTH_LONG).show();
break;
}
}
@Override
public void handleMessageOnWorker(Message msg) {
super.handleMessageOnWorker(msg);
switch (msg.what) {
case MSG_01:
Log.e(TAG, "handleMessageOnWorker: 工作线程发送消息");
break;
case MSG_02:
Log.e(TAG, "handleMessageOnWorker: UI线程post切换到工作线程");
break;
}
}
};
三、XHandler 实现原理
通过Android API提供的HandlerThread类,该类也是一个Thread线程类,不同的是其中加入了Looper的实现,因此可以配合Handler进行使用。然后再handleMessage方法中,把消息传递过来的Runnable线程接口,交由线程池ExecutorService去执行。如果不用线程池ExecutorService,则消息由HandlerThread执行,如果频繁发送消息,则消息会依次顺序执行。
Github项目地址(欢迎Star) : XHandler
(XHandler目前处于开发阶段,还有许多尚未完善的地方,不喜勿喷)
上一篇: 关于removeCallbacks不能移除消息的问题
下一篇: python实现随机森林