HandlerThread 建立一個異步的後臺線程

使用HandlerThread幾大優勢:android

一、製做一個後臺異步線程,須要的時候就能夠丟一個任務給它,使用比較靈活;異步

二、Android系統提供的,使用簡單方便,內部本身封裝了Looper+Handler機制;ide

三、能夠代替Thread + Looper + Handler的寫法;oop

四、能夠避免項目中隨處可見的 new Thread().start(),增長系統開銷;post

 

使用HandlerThread注意:ui

一、不要執行太耗時(通常狀況不要超過100ms級別的)的任務,若是太耗時可能會阻塞其餘的任務,使得其餘任務遲遲得不到執行的結果spa

二、要本身控制好合適的生命週期,啓動和結束都要本身控制.net

 

使用HandlerThread封裝一個必定生命週期內的後臺線程線程

使用場景:code

有一個相對比較大的功能,主界面是一個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使用案例:

一、在Activity的onCreate中執行HandlerThread初始化和啓動操做

BackgroundThread.prepareThread();

 

二、在Activity的onDestroy中執行HandlerThread的銷燬操做

BackgroundThread.destroyThread();

 

三、在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

相關文章
相關標籤/搜索