2010-09-13 51 views
1

我一直在與我的一項服務中發生的ANR作戰一段時間。這是非常難以複製和用戶界面似乎具有完整的功能之前,它發生100%的時間沒有任何明顯的滯後或凍結。我的服務有一個TimerTask和一些它運行的AsyncTask,就是這樣。幫助閱讀Android中的ANR堆棧痕跡

當您在2.2版的Android Market中報告時,獲得的堆棧跟蹤很難閱讀,似乎沒有直接引用我的任何代碼,而只能從SDK中的類中引用。任何人都可以看看堆棧跟蹤,看看你是否可以知道發生了什麼。

打印出來的內容太大了,我選擇將它發佈到pastebin,我希望這不違反規則。 http://pastebin.com/KHUD0UHW

這裏是logcat的日誌以及 http://pastebin.com/V5xSey36

+0

主線程在更新屏幕的視圖層次結構中向下。你有logcat的ANR數據嗎?上面加了 – fadden 2010-09-14 17:58:39

+0

。 – schwiz 2010-09-17 21:55:45

+0

我注意到Main做的最後一件事是在Canvas上繪製一個BitmapDrawable。什麼是繪製該位圖可以使主線程掛起?你用什麼方法來填充圖像的視圖? – magaio 2010-09-19 22:15:37

回答

5

這是可能的,這不是你的錯應用。無論「當前」應用是什麼,ANR都會顯示出來。但是,如果系統上的另一個應用程序真的拿走你的CPU並迫使你的應用程序捱餓,你的應用程序將獲得ANR,因爲它具有用戶的焦點。如果是這種情況,你就無能爲力。也許最好的測試方法是監視或強制系統進行同步。同步通常在手機上很沉重,並且可能會導致功率不足的手機出現嚴重滯後。

另一種測試手機速度較慢的方法是從市場上安裝一個大型應用程序。下載後進入「安裝」階段後,在您的應用中執行一些操作。如果安裝階段花費時間超過5秒鐘,那麼您的應用獲得ANR的機會相當大。這是因爲安裝應用程序時IO速度較差。 IO阻止其他應用程序獲取CPU時間。 Android認爲這意味着你正在竊取它。