本管理器優(yōu)點(diǎn):
1.單頁面來說,handlerThread作為主要管理方式,一個(gè)線程復(fù)用,對(duì)性能影響小
2.簡(jiǎn)化代碼,一句代碼即可開啟一個(gè)異步任務(wù),一句代碼把異步結(jié)果傳給UI線程
本管理器缺點(diǎn):
1.由于單線程串行處理任務(wù),有阻塞情況會(huì)影響其他任務(wù)。
2.每個(gè)activity一個(gè)管理器(一個(gè)線程),當(dāng)連續(xù)開啟多個(gè)activity的時(shí)候,同樣對(duì)性能影響較大,有OOM風(fēng)險(xiǎn)。
以前寫項(xiàng)目的時(shí)候,都是直接new Thread()來創(chuàng)建線程,這樣寫項(xiàng)目后期非常不利于維護(hù),然后考慮是否能寫一個(gè)類專門用來管理線程呢?
首先我們需要?jiǎng)?chuàng)建一個(gè)線程:
private HandlerThread mHandlerThread;
public void oncreate() {
this.mHandlerThread =
new HandlerThread("activity worker:" + this.getClass().getSimpleName());
this.mHandlerThread.start();
}
第二我們線程管理器只是管理線程,不進(jìn)行具體的邏輯操作,那么就用到了Handler機(jī)制:
先創(chuàng)建一個(gè)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è)務(wù)代碼
}
}
}
由于Handler為靜態(tài)內(nèi)部類,與外部類并無直接聯(lián)系,這樣處理容易產(chǎn)生內(nèi)存泄漏,manager對(duì)象無法釋放,那么就要介入弱引用來處理該代碼(也可以用軟引用):
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è)務(wù)代碼
}
}
}
同理還有創(chuàng)建一個(gè)異步線程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è)務(wù)代碼
}
}
}
這兩個(gè)Handler我們需要在線程創(chuàng)建的時(shí)候就創(chuàng)建,所以O(shè)nCreate方法要這樣改:
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有異步請(qǐng)求。
2.Manager給BackgroundHandler發(fā)消息讓他處理異步邏輯。
3.BackgroundHandler處理異步邏輯,并把處理結(jié)果返回給Manager。
4.Manager拿到處理結(jié)果發(fā)消息給UiHandler。
5.責(zé)任人(UiHandler)處理最后邏輯。
1.接收異步請(qǐng)求方法:
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;//后臺(tái)接收消息的handler載體
private Handler mUiHandler;//主線程接收消息的handler載體
public HandlerManager() {
}
//給主線直接發(fā)送message對(duì)象
public void sendUiMessage(Message message) {
this.mUiHandler.sendMessage(message);
}
//給主線程發(fā)送what和obj,自動(dòng)組合成message對(duì)象
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,自動(dòng)組合成message對(duì)象(帶延遲)
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對(duì)象(帶延遲)
public void sendUiMessage(Message message, long delay) {
this.mUiHandler.sendMessageDelayed(message, delay);
}
//給后臺(tái)線程發(fā)送message對(duì)象(帶延遲)
public void sendBackgroundMessage(Message message, long delay) {
this.mBackgroundHandler.sendMessageDelayed(message, delay);
}
//給后臺(tái)線程發(fā)送what和obj,自動(dòng)組合成message對(duì)象(帶延遲)
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();
}
//給后臺(tái)線程發(fā)送message對(duì)象
public void sendBackgroundMessage(Message message) {
this.mBackgroundHandler.sendMessage(message);
}
//給后臺(tái)線程發(fā)送what和obj,自動(dòng)組合成message對(duì)象
public void sendBackgroundMessage(int what, Object object) {
Message message = this.obtainBackgroundMessage();
message.what = what;
message.obj = object;
this.sendBackgroundMessage(message);
}
//給后臺(tái)線程發(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對(duì)象
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對(duì)象中數(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);
}
}
}
/**
* 后臺(tái)線程
* */
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) {
}

推薦下本人的微信公眾號(hào),本博客及其他方面的消息會(huì)定期同步到公眾號(hào)上面!