使用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