Android幾種非同步方式,解決主執行緒中遇到的卡頓

helang1991發表於2018-08-20

起因:

當我們的UI越來越複雜的時候,或者說某個業務需要大量的計算的時候,我們的主執行緒會消耗大量的資源去計算,這個時候,我們的Activity或者說fragmemt等UI頁面就會出現卡頓,乃至ANR。總結一下,就是我們直接在主執行緒(UI執行緒)中,做耗時操作,就會造成卡頓,甚至ANR

解決方案:

1.優化耗時的計算,提高演算法,利用快取等資料;這種方式,一般帶來的提升在App這種場景中微乎其微,只有在大規模的併發場景中才會體現出效果(伺服器後臺服務中),打個比方,你存一年1W塊錢的定期,一年利息才200多塊,當你存1000W的時候,一年利息就有20多W,這種效果才明顯(手動滑稽)

2.利用非同步的方式,簡單來說,開啟另外一個執行緒去做耗時操作,利用CPU的多執行緒模式,這樣我們的主執行緒就不會卡頓在耗時操作中

非同步的方式:

1.直接使用繼承Thread類或者實現Runable介面(和主執行緒通訊還得使用handler)

2.AsyscTask(它的原理主要是利用執行緒池,各個歷史版本系統版本可能會有不同的缺陷)

3.利用Handler,Message,Looper(主執行緒預設開啟了Looper)

4.RxJava 執行緒模式.subscribeOn(Schedulers.io()),這樣可以開啟一個新執行緒來執行裡面的耗時程式碼

嚴格的地來說,Android裡面,主執行緒和子執行緒之間,不能使用sleep(),wait(),notify()等Java原生的執行緒通訊的方式,因為,主執行緒一旦sleep那麼整個App都不能正常執行(所有的Activity,Service等都在主執行緒執行中呢)


相關文章