Android 系統穩定性 ANR(三)

2021-07-10 05:00:36 字數 1382 閱讀 4197

1.4 如何避免anr

1.4.1 anr發生在主線程,不要阻塞主線程

android應用程式的所有標準元件全部執行在乙個單一的主線程中,在主線程中所做的任何耗時的操作都有可能造成anr,因為這些耗時的操作會使得主線程沒有機會處理使用者輸入事件或者廣播事件。 

因此在主線程中執行的任何函式所做的工作都應該盡可能的少,特別是對於activity的生命週期函式來說。網路和資料庫操作,以及諸如位圖變換的一些耗時的操作,都應該放在子執行緒中完成。主線程不需要等待子執行緒的執行,主線程應該建立乙個與其繫結的handler物件,子執行緒執行完畢後通過handler通知主線程。 

建立子執行緒的方式有很多,android中提供了很多相關的api,例如handlerthread、asynctask、asyncqueryhandler等,當然也可以建立簡單的執行緒或執行緒池。不過需要注意的是,不要製造太多的「野」執行緒,例如在android原生**中經常會見到在某個函式中new了乙個thread物件,呼叫其start函式啟動後就不再管理了。筆者對這種寫法並不認同,這種寫法的優點是避免了子執行緒對某些物件的強引用,以免記憶體洩漏,但是反而有潛在的風險會造成「執行緒洩漏」,也就是說可能會多次執行相同的操作建立大量的子執行緒,而這些子執行緒很可能由於某種原因被阻塞而都無法正常退出,大量的執行緒本身就會占用記憶體和cpu,搶占臨界資源,而且執行的多是重複的操作。所以筆者建議將子執行緒「管理」起來,無論是用標誌位還是用成員變數,總之不要讓執行緒隨意的被建立,用有限數量的執行緒或執行緒池處理所有的請求,可以用handler將請求佇列化,去除重複的請求減少資源浪費,同時應該在適當的時候(例如activity銷毀時)考慮停止子執行緒,避免不必要的操作和記憶體洩漏。 

broadcastreceiver通常是用來在後台執行一些小型的、瑣碎的工作,例如儲存程式設定。不要在br中執行需要長時間執行的操作,這些操作應該放到serivce中。另外,不要在br中啟動乙個activity,因為那樣會建立乙個新的視窗,新視窗會搶奪螢幕焦點,使用者原先正在互動的視窗失去焦點後就不會再接收到輸入事件。新視窗的突然出現可能會讓使用者很詫異,或者也有可能出現由於舊視窗的層(window的type屬性)比較高,新視窗沒能顯示,但是輸入事件又被新視窗搶奪的情況。如果在br中有訊息要提示使用者,可以考慮使用notificationmanager在狀態列中顯示通知來達到目的。 

1.4.2 消除停頓感

通常人們感知介面有停頓感的時間需要100到200毫秒,所以為了給使用者更好的體驗,在避免anr的基礎上更進一步來消除停頓感,有以下幾個建議: 

如果應用程式正在後台執行耗時工作,可以使用progressbar或者progressdialog來提示使用者工作進度;

對於遊戲類的應用,應該使用子執行緒去做位置計算; 

如果應用程式的初始化過程比較耗時,可以在初始化時顯示乙個過場動畫或者,也可以先快速的顯示主介面然後再非同步的載入初始化資料。

Android 系統穩定性 ANR(三)

android anr穩定性 android應用程式的所有標準元件全部執行在乙個單一的主線程中,在主線程中所做的任何耗時的操作都有可能造成anr,因為這些耗時的操作會使得主線程沒有機會處理使用者輸入事件或者廣播事件。因此在主線程中執行的任何函式所做的工作都應該盡可能的少,特別是對於activity的...

系統穩定性測試

簡介 利爾達自主lorawan系統包含lorawan節點 閘道器 ns伺服器三個部分,本次測試針對感測器類終端,定時上報的class a典型應用,驗證系統的工作穩定性。受測產品 節點 lsd4wn 2l817m90 閘道器 lsd4wn 2332xgw1 網路伺服器 lierda 3.0 unico...

android 穩定性monkey測試

本篇針對應用記憶體洩漏測試,簡單介紹一下記憶體洩漏的危害,記憶體洩漏指程式中己動態分配的堆記憶體由於某種原因程式未釋放或無法釋放,造成系統記憶體的浪費,導致程式執行速度減慢甚至系統崩潰等嚴重後果。簡單來說就是如果存在記憶體洩漏的話,應用會越用越卡,最後導致應用崩潰。前提準備條件 1 手機root許可...