HandlerThread 創建一個異步的后台線程


使用HandlerThread幾大優點:

1、制作一個后台異步線程,需要的時候就可以丟一個任務給它,使用比較靈活;

2、Android系統提供的,使用簡單方便,內部自己封裝了Looper+Handler機制;

3、可以代替Thread + Looper + Handler的寫法;

4、可以避免項目中隨處可見的 new Thread().start(),增加系統開銷;

 

使用HandlerThread注意:

1、不要執行太耗時(一般情況不要超過100ms級別的)的任務,如果太耗時可能會阻塞其他的任務,使得其他任務遲遲得不到執行的結果

2、要自己控制好合適的生命周期,啟動和結束都要自己控制

 

使用HandlerThread封裝一個一定生命周期內的后台線程

使用場景:

有一個相對比較大的功能,主界面是一個Activity,在這個Activity內有很多的交互,不同的界面可能會加載不同是數據

源碼封裝:

源碼中使用HandlerThread的Handler的post的方式,沒有使用Handler的sendMessage(message)的方式,使用post的方式比較簡單,代碼少,其實post內部也是調用了sendMessage的方式的

/** * 需要自己控制生命周期,在這個生命周期內都可以使用這個線程 * */
public class BackgroundThread extends HandlerThread { private static BackgroundThread mInstance; private static Handler mHandler; public BackgroundThread() { super("ThreadName", android.os.Process.THREAD_PRIORITY_DEFAULT); } public static void prepareThread() { if (mInstance == null) { mInstance = new BackgroundThread(); // 創建HandlerThread后一定要記得start()
 mInstance.start(); // 獲取HandlerThread的Looper,創建Handler,通過Looper初始化
             mHandler = new Handler(mInstance.getLooper()); } } /** * 如果需要在后台線程做一件事情,那么直接調用post方法,使用非常方便 */
    public static void post(final Runnable runnable) { mHandler.post(runnable); } public static void postDelayed(final Runnable runnable, long nDelay) { mHandler.postDelayed(runnable, nDelay); } /** * 退出HandlerThread */
    public static void destroyThread() { if (mInstance != null) {  mInstance.quit(); mInstance = null; mHandler = null; } } }

BackgroundThread使用案例:

1、在Activity的onCreate中執行HandlerThread初始化和啟動操作

BackgroundThread.prepareThread();

 

2、在Activity的onDestroy中執行HandlerThread的銷毀操作

BackgroundThread.destroyThread();

 

3、在BackgroudThread的生命周期內,任何地方都可以調用post或者postDelayed方法給線程丟一個任務

BackgroundThread.post(new Runnable() { @Override public void run() { // 執行耗時操作(這里就是同步操作) // 執行完成得到結果 // 對結果進行處理,如果需要操作UI,得使用主線程的Handler拋到主線程執行(或者其他的方式)
 } });

 

擴展閱讀:

HandlerThread之Handler的sendMessage方法:

 

 

HandlerThread的Handler的post方法源碼內部調用:

  

 

Android HandlerThread 完全解析

http://blog.csdn.net/lmj623565791/article/details/47079737/

Android Thread Looper Handler 關系

http://blog.csdn.net/elfylin/article/details/6085042

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM