什麼是ANR 如何避免它?

2021-07-11 00:57:26 字數 1218 閱讀 9468

anr定義

如何來避免:

考慮上面的anr定義,讓我們來研究一下為什麼它會在android應用程式裡發生和如何最佳構建應用程式來避免anr。

android應用程式通常是執行在乙個單獨的執行緒(例如,main)裡。這意味著你的應用程式所做的事情如果在主線程裡占用了太長的時間的話,就會引發anr對話方塊,因為你的應用程式並沒有給自己機會來處理輸入事件或者intent廣播。

因此,執行在主線程裡的任何方法都盡可能少做事情。特別是,activity應該在它的關鍵生命週期方法(如oncreate()和onresume())裡盡可能少的去做建立操作。潛在的耗時操作,例如網路或資料庫操作,或者高耗時的計算如改變位圖尺寸,應該在子執行緒裡(或者以資料庫操作為例,通過非同步請求的方式)來完成。然而,不是說你的主線程阻塞在那裡等待子執行緒的完成——也不是呼叫thread.wait()或是thread.sleep()。替代的方法是,主線程應該為子執行緒提供乙個handler,以便完成時能夠提交給主線程。以這種方式設計你的應用程式,將能保證你的主線程保持對輸入的響應性並能避免由於5秒輸入事件的超時引發的anr對話方塊。這種做法應該在其它顯示ui的執行緒裡效仿,因為它們都受相同的超時影響。

intentreceiver執行時間的特殊限制意味著它應該做:在後台裡做小的、瑣碎的工作如儲存設定或者註冊乙個notification。和在主線程裡呼叫的其它方法一樣,應用程式應該避免在broadcastreceiver裡做耗時的操作或計算。但不再是在子執行緒裡做這些任務(因為broadcastreceiver的生命周期短),替代的是,如果響應intent廣播需要執行乙個耗時的動作的話,應用程式應該啟動乙個service。順便提及一句,你也應該避免在intent receiver裡啟動乙個activity,因為它會建立乙個新的畫面,並從當前使用者正在執行的程式上搶奪焦點。如果你的應用程式在響應intent廣播時需要向使用者展示什麼,你應該使用notification manager來實現。

一般來說,在應用程式裡,100到200ms是使用者能感知阻滯的時間閾值。因此,這裡有一些額外的技巧來避免anr,並有助於讓你的應用程式看起來有響應性。

如果你的應用程式為響應使用者輸入正在後台工作的話,可以顯示工作的進度(progressbar和progressdialog對這種情況來說很有用)。

特別是遊戲,在子執行緒裡做移動的計算。

如果你的應用程式有乙個耗時的初始化過程的話,考慮可以顯示乙個splash screen或者快速顯示主畫面並非同步來填充這些資訊。在這兩種情況下,你都應該顯示正在進行的進度,以免使用者認為應用程式被凍結了。

什麼是ANR 如何避免它?

anr定義 如何來避免 考慮上面的anr定義,讓我們來研究一下為什麼它會在android應用程式裡發生和如何最佳構建應用程式來避免anr。android應用程式通常是執行在乙個單獨的執行緒 例如,main 裡。這意味著你的應用程式所做的事情如果在主線程裡占用了太長的時間的話,就會引發anr對話方塊,...

ANR是什麼?怎樣避免和解決ANR

anr是什麼?怎樣避免和解決anr 並不希望每次都要處理這個對話方塊。因此,在程式裡對響應效能的設計很重要,這樣,系統不會顯示anr給使用者。activity 5秒 broadcast10秒耗時的操作 worker thread 裡面完成,handler message asyntask inten...

什麼是死鎖?如何避免死鎖?

所謂死鎖 是指兩個或兩個以上的程序在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去。此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的程序稱為死鎖程序。由於資源占用是互斥的,當某個程序提出申請資源後,使得有關程序在無外力協助下,永遠分配不到必需的資源而...