使用HandlerThread幾大優點: 1、製作一個後臺非同步線程,需要的時候就可以丟一個任務給它,使用比較靈活; 2、Android系統提供的,使用簡單方便,內部自己封裝了Looper+Handler機制; 3、可以代替Thread + Looper + Handler的寫法; 4、可以避免項目中 ...
使用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