一、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目前處於開發階段,還有許多尚未完善的地方,不喜勿噴)