Android 自定義線程管理器(串行)

本管理器優(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) {
}
二維碼.jpg

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容