本管理器優(yōu)點:
1.單頁面來說蝠筑,handlerThread作為主要管理方式物赶,一個線程復用,對性能影響小
2.簡化代碼较坛,一句代碼即可開啟一個異步任務印蔗,一句代碼把異步結(jié)果傳給UI線程
本管理器缺點:
1.由于單線程串行處理任務,有阻塞情況會影響其他任務丑勤。
2.每個activity一個管理器(一個線程)华嘹,當連續(xù)開啟多個activity的時候,同樣對性能影響較大法竞,有OOM風險耙厚。
以前寫項目的時候,都是直接new Thread()來創(chuàng)建線程岔霸,這樣寫項目后期非常不利于維護薛躬,然后考慮是否能寫一個類專門用來管理線程呢?
首先我們需要創(chuàng)建一個線程:
private HandlerThread mHandlerThread;
public void oncreate() {
this.mHandlerThread =
new HandlerThread("activity worker:" + this.getClass().getSimpleName());
this.mHandlerThread.start();
}
第二我們線程管理器只是管理線程呆细,不進行具體的邏輯操作型宝,那么就用到了Handler機制:
先創(chuàng)建一個UiHandler:
private static class UiHandler extends Handler {
private HandlerManager manager;
public UiHandler(HandlerManager manager) {
this.manager = manager;
}
public void handleMessage(Message msg) {
super.handleMessage(msg);
if(manager != null) {
//調(diào)用處理業(yè)務代碼
}
}
}
由于Handler為靜態(tài)內(nèi)部類,與外部類并無直接聯(lián)系,這樣處理容易產(chǎn)生內(nèi)存泄漏趴酣,manager對象無法釋放梨树,那么就要介入弱引用來處理該代碼(也可以用軟引用):
private static class UiHandler extends Handler {
private WeakReference<HandlerManager> mActivityReference;
public UiHandler(HandlerManager manager) {
this.mActivityReference = new WeakReference(manager);
}
public void handleMessage(Message msg) {
super.handleMessage(msg);
//調(diào)用處理業(yè)務代碼
}
}
}
同理還有創(chuàng)建一個異步線程BackgroundHandler,需要注意的是創(chuàng)建該Handler需要把新創(chuàng)建的線程looper傳遞過去:
private static class BackgroundHandler extends Handler {
private WeakReference<HandlerManager> mActivityReference;
BackgroundHandler(HandlerManager manager, Looper looper) {
super(looper);
this.mActivityReference = new WeakReference(manager);
}
//發(fā)送消息
public void handleMessage(Message msg) {
super.handleMessage(msg);
//調(diào)用處理業(yè)務代碼
}
}
}
這兩個Handler我們需要在線程創(chuàng)建的時候就創(chuàng)建岖寞,所以OnCreate方法要這樣改:
public void oncreate() {
this.mHandlerThread = new HandlerThread("activity worker:" + this.getClass().getSimpleName());
this.mHandlerThread.start();
this.mBackgroundHandler
= new BackgroundHandler(this, this.mHandlerThread.getLooper());
this.mUiHandler = new UiHandler(this);
}
第三我們就要發(fā)送消息了抡四,先理清邏輯:
1.通過消息通知Manager有異步請求。
2.Manager給BackgroundHandler發(fā)消息讓他處理異步邏輯仗谆。
3.BackgroundHandler處理異步邏輯指巡,并把處理結(jié)果返回給Manager。
4.Manager拿到處理結(jié)果發(fā)消息給UiHandler隶垮。
5.責任人(UiHandler)處理最后邏輯藻雪。
1.接收異步請求方法:
public void sendBackgroundMessage(int what, Object object) {
Message message = this.obtainBackgroundMessage();
message.what = what;
message.obj = object;
this.sendBackgroundMessage(message);
}
public Message obtainBackgroundMessage()
return this.mBackgroundHandler.obtainMessage();
}
2.發(fā)消息給BackGroundHandler:
public void sendBackgroundMessage(Message message) {
this.mBackgroundHandler.sendMessage(message);
}
3.BackgroudHandler處理異步邏輯:
private static class BackgroundHandler extends Handler {
private WeakReference<HandlerManager> mActivityReference;
BackgroundHandler(HandlerManager manager, Looper looper) {
super(looper);
this.mActivityReference = new WeakReference(manager);
}
//發(fā)送消息
public void handleMessage(Message msg) {
super.handleMessage(msg);
//如果引用不為空,發(fā)送消息
if(this.mActivityReference.get() != null) {
((HandlerManager)this.mActivityReference.get()).handleBackgroundMessage(msg);
}
}
}
public abstract void handleBackgroundMessage(Message var1);
4.Manager拿到處理結(jié)果發(fā)消息給UiHandler:
public void sendUiMessage(int what, Object obj, long delay) {
Message me = this.obtainUiMessage();
me.what = what;
me.obj = obj;
this.sendUiMessage(me, delay);
}
public void sendUiMessage(Message message, long delay) {
this.mUiHandler.sendMessageDelayed(message, delay);
}
5.UiHandler處理最后邏輯:
private static class UiHandler extends Handler {
private WeakReference<HandlerManager> mActivityReference;
public UiHandler(HandlerManager manager) {
this.mActivityReference = new WeakReference(manager);
}
public void handleMessage(Message msg) {
super.handleMessage(msg);
if(this.mActivityReference.get() != null) {
((HandlerManager)this.mActivityReference.get()).handleUiMessage(msg);
}
}
}
public abstract void handleUiMessage(Message var1);
最后附帶完整代碼:
public abstract class HandlerManager {
private HandlerThread mHandlerThread;//含有Looper的Thread
private BackgroundHandler mBackgroundHandler;//后臺接收消息的handler載體
private Handler mUiHandler;//主線程接收消息的handler載體
public HandlerManager() {
}
//給主線直接發(fā)送message對象
public void sendUiMessage(Message message) {
this.mUiHandler.sendMessage(message);
}
//給主線程發(fā)送what和obj岁疼,自動組合成message對象
public void sendUiMessage(int what, Object object) {
Message message = this.obtainUiMessage();
message.what = what;
message.obj = object;
this.sendUiMessage(message);
}
//給主線程發(fā)送空消息
public void sendUiMessage(int what) {
this.mUiHandler.sendEmptyMessage(what);
}
//給主線程發(fā)送延遲消息
public void sendUiMessage(int what, long delay) {
this.mUiHandler.sendEmptyMessageDelayed(what, delay);
}
//給主線程發(fā)送what和obj阔涉,自動組合成message對象(帶延遲)
public void sendUiMessage(int what, Object obj, long delay) {
Message me = this.obtainUiMessage();
me.what = what;
me.obj = obj;
this.sendUiMessage(me, delay);
}
//給主線直接發(fā)送message對象(帶延遲)
public void sendUiMessage(Message message, long delay) {
this.mUiHandler.sendMessageDelayed(message, delay);
}
//給后臺線程發(fā)送message對象(帶延遲)
public void sendBackgroundMessage(Message message, long delay) {
this.mBackgroundHandler.sendMessageDelayed(message, delay);
}
//給后臺線程發(fā)送what和obj缆娃,自動組合成message對象(帶延遲)
public void sendBackgroundMessage(int what, Object object, long delay) {
Message me = this.obtainBackgroundMessage();
me.what = what;
me.obj = object;
this.sendBackgroundMessage(me, delay);
}
public Message obtainUiMessage() {
return this.mUiHandler.obtainMessage();
}
//給后臺線程發(fā)送message對象
public void sendBackgroundMessage(Message message) {
this.mBackgroundHandler.sendMessage(message);
}
//給后臺線程發(fā)送what和obj捷绒,自動組合成message對象
public void sendBackgroundMessage(int what, Object object) {
Message message = this.obtainBackgroundMessage();
message.what = what;
message.obj = object;
this.sendBackgroundMessage(message);
}
//給后臺線程發(fā)送空消息
public void sendBackgroundMessage(int what) {
this.mBackgroundHandler.sendEmptyMessage(what);
}
//給主線程發(fā)送空消息(帶延遲)
public void sendBackgroundMessage(int what, long delay) {
this.mBackgroundHandler.sendEmptyMessageDelayed(what, delay);
}
public Message obtainBackgroundMessage() {
return this.mBackgroundHandler.obtainMessage();
}
//初始化handlermanager對象
public void oncreate() {
this.mHandlerThread
= new HandlerThread("activity worker:"
+ this.getClass().getSimpleName());
this.mHandlerThread.start();
this.mBackgroundHandler
= new BackgroundHandler(this, this.mHandlerThread.getLooper());
this.mUiHandler = new UiHandler(this);
}
//清空HandlerManager對象中數(shù)據(jù),防止內(nèi)存泄漏
public void onDestroy() {
if(this.mBackgroundHandler != null &&
this.mBackgroundHandler.getLooper() != null) {
this.mBackgroundHandler.getLooper().quit();
}
}
public abstract void handleBackgroundMessage(Message var1);
public abstract void handleUiMessage(Message var1);
/**
* UI線程
* */
private static class UiHandler extends Handler {
//HandlerManager 的弱引用贯要,防止內(nèi)存泄漏
private WeakReference<HandlerManager> mActivityReference;
public UiHandler(HandlerManager manager) {
this.mActivityReference = new WeakReference(manager);
}
public void handleMessage(Message msg) {
super.handleMessage(msg);
//如果引用不為空暖侨,發(fā)送消息
if(this.mActivityReference.get() != null) {
((HandlerManager)this.mActivityReference.get())
.handleUiMessage(msg);
}
}
}
/**
* 后臺線程
* */
private static class BackgroundHandler extends Handler {
//HandlerManager 的弱引用,防止內(nèi)存泄漏
private WeakReference<HandlerManager> mActivityReference;
BackgroundHandler(HandlerManager manager, Looper looper) {
super(looper);
this.mActivityReference = new WeakReference(manager);
}
//發(fā)送消息
public void handleMessage(Message msg) {
super.handleMessage(msg);
//如果引用不為空崇渗,發(fā)送消息
if(this.mActivityReference.get() != null) {
((HandlerManager)this.mActivityReference.get())
.handleBackgroundMessage(msg);
}
}
}
下面是調(diào)用代碼(建議寫在BaseActivity中):
private HandlerManager handlerManager;//線程管理器
private void initHandle() {
this.handlerManager = new HandlerManager() {
public void handleBackgroundMessage(Message message) {
BaseActivity.this.handleBackgroundMessage(message);
}
public void handleUiMessage(Message message) {
BaseActivity.this.handleUiMessage(message);
}
};
this.handlerManager.oncreate();
}
public void onDestroy() {
super.onDestroy();
this.handlerManager.onDestroy();
}
@Override
public void sendUiMessage(Message var1) {
handlerManager.sendUiMessage(var1);
}
@Override
public void sendUiMessage(int var1, Object var2) {
handlerManager.sendUiMessage(var1, var2);
}
@Override
public void sendUiMessage(int var1) {
handlerManager.sendUiMessage(var1);
}
@Override
public void sendUiMessage(int var1, long var2) {
handlerManager.sendUiMessage(var1, var2);
}
@Override
public void sendUiMessage(int var1, Object var2, long var3) {
handlerManager.sendUiMessage(var1, var2, var3);
}
@Override
public void sendUiMessage(Message var1, long var2) {
handlerManager.sendUiMessage(var1, var2);
}
@Override
public void sendBackgroundMessage(Message var1) {
handlerManager.sendBackgroundMessage(var1);
}
@Override
public void sendBackgroundMessage(int var1, Object var2) {
handlerManager.sendBackgroundMessage(var1,var2);
}
@Override
public void sendBackgroundMessage(int var1) {
handlerManager.sendBackgroundMessage(var1);
}
@Override
public void sendBackgroundMessage(int var1, long var2) {
handlerManager.sendBackgroundMessage(var1,var2);
}
@Override
public void sendBackgroundMessage(int var1, Object var2, long var3) {
handlerManager.sendBackgroundMessage(var1,var2,var3);
}
@Override
public void sendBackgroundMessage(Message var1, long var2) {
handlerManager.sendBackgroundMessage(var1,var2);
}
@Override
public void handleBackgroundMessage(Message var1) {
}
@Override
public void handleUiMessage(Message var1) {
}
推薦下本人的微信公眾號字逗,本博客及其他方面的消息會定期同步到公眾號上面!