- 不能通過非UI線程對View進行操作。因爲Android的UI不是安全的,如果View能被不同的線程所訪問或修改,那麼就可能在程序的執行期間,產生不可預期的行爲或者併發錯誤。
- 使用線程時,避免在循壞中使用同步,因爲獲取和釋放鎖的操作代價很大。會引起CPU資源的損耗。
- 處理多線程以及線程間通信時,使用
HandlerThread
來操作,它內部包裝了Looper,記得不用的時候退出/釋放資源哦。 - 當工作線程與UI線程之間通信的時候,推薦使用AsyncTask(Android 7.0後內部任務變成串行處理,不再會出現以前並行時超過任務數執行飽和策略的情況)
- Loader可以用來代替AsyncTask的某些情況,因爲Loader的生命週期是獨立的(與Application Context有關),當Activity/Fragment銷燬重建時,它仍然在,而且它特別使用異步操作,比如AsyncTaskLoader代替AsyncTask也可以實現後者的功能,但是生命週期完全獨立於Activity。切記Loader使用完記得銷燬。
- 當你的Service不需要交互時,請使用可以自動停止的IntentService。
- 當你希望延長BroadcastReceiver的生命週期時,例如啓動一個後臺線程IntentService。在onReceiver中調用
BroadcastReceiver.goAsync()
,它會返回一個PendingResult對象,這時,廣播接收器的生命週期會延長持續到PendingResult.finish()
方法調用。 - 線程池最好用構造方法手動創建,而不要用Executors來直接調用工廠方法,這樣利於明白線程池的運行規則,避免用了錯誤的線程池導致資源耗盡。
- 給線程一個好聽的名字,調試時候用。
- 線程池設置線程的存活時間,以保證空閒線程準確釋放。
END