在android裡,應用程式的響應性是由activity manager和windowmanager系統服務監視的 。當它監測到以下情況中的乙個時,android就會針對特定的應用程式顯示anr:
1.在5秒內沒有響應輸入的事件(例如,按鍵按下,螢幕觸控)
2.broadcastreceiver在10秒內沒有執行完畢
1.潛在的耗時操作,例如網路或資料庫操作,或者高耗時的計算如改變位圖尺寸,應該在子執行緒裡(或者以資料庫操作為例,通過非同步請求的方式)來完成。
2.broadcastreceiver中執行了耗時操作。
1、執行在主線程裡的任何方法都盡可能少做事情。特別是,activity應該在它的關鍵生命週期方法(如oncreate()和onresume())裡盡可能少的去做建立操作。(可以採用重新開啟子執行緒的方式,然後使用handler+message的方式做一些操作,比如更新主線程中的ui等)
2、應用程式應該避免在broadcastreceiver裡做耗時的操作或計算。但不再是在子執行緒裡做這些任務(因為 broadcastreceiver的生命周期短),替代的是,如果響應intent廣播需要執行乙個耗時的動作的話,應用程式應該啟動乙個 service。(此處需要注意的是可以在廣播接受者中啟動service,但是卻不可以在service中啟動broadcasereciver,關於原因後續會有介紹,此處不是本文重點)
3、避免在intent receiver裡啟動乙個activity,因為它會建立乙個新的畫面,並從當前使用者正在執行的程式上搶奪焦點。如果你的應用程式在響應intent廣 播時需要向使用者展示什麼,你應該使用notification manager來實現。
4.通常100到200毫秒就會讓人察覺程式反應慢,為了更加提公升響應,
如果程式正在後台處理使用者的輸入,建議使用讓使用者得知進度,比如使用progressbar控制項,程式啟動時可以選擇加上歡迎介面,避免讓使用者察覺卡頓,使用systrace和traceview找出影響響應的問題。
參考:
Android中ANR的產生原因和解決辦法
預設情況下,在android中activity的最長執行時間是5秒,broadcastreceiver的最長執行時間則是10秒。在android裡,應用程式的響應性是由activitymanager和windowmanager系統服務監視的。當它監測到以下情況中的乙個時,android就會針對特定的...
ANR原因及預防
首先anr的發生是有條件限制的,分為以下三點 1.只有主線程才會產生anr,主線程就是ui執行緒 2.必須發生某些輸入事件或特定操作,比如按鍵或觸屏等輸入事件,在broadcastreceiver或service的各個生命週期呼叫函式 3.上述事件響應超時,不同的context規定的上限時間不同 a...
避免出現anr的方法 ANR的產生原因及避免辦法
在android上,如果你的應用程式有 responding 對話方塊。使用者可以選擇讓程式繼續執行,但是,他們在使用你的應用程式時,並不希望每次都要處理這個對話方塊。因此,在程式裡對響應性 能的設計很重要,這樣,系統不會顯示anr給使用者。如何來避免 考慮上面的anr定義,讓我們來研究一下為什麼它...