9

所以我有一個奇怪的問題,我不完全確定我應該提供的所有信息,但我會盡我所能 - 只要讓我知道是否需要添加更多信息。我遇到了一個問題,當我完成我的Activity並返回到之前的Activity(或者以新的Intent啓動時 - 問題似乎集中在完成Activity時),UI性能急劇下降大約六到七秒,然後恢復正常。一旦ActivityRecord的活動閒置超時

07-11 22:09:42.594: W/ActivityManager(292): Launch timeout has expired, giving up wake lock! 
07-11 22:09:42.601: W/ActivityManager(292): Activity idle timeout for ActivityRecord{42bf6e00 com.kcoppock.sudokubeta/com.kcoppock.sudoku.SudokuBoardActivity} 

的活動超時,UI性能恢復正常:

LogCat,此警告持續出現。在此之前,它非常緩慢。我沒有任何代碼,我知道這可能會阻止主線程,而且我甚至已經註釋掉了我的整個onPause()方法,以查看它是否有任何區別,事實並非如此。

Activity不產生任何後臺線程,不執行任何網絡活動,它唯一的磁盤訪問是SharedPreferences的一些訪問。我能找到的以前的問題是關於HistoryRecord的空閒超時,而不是ActivityRecord

任何想法會導致這種情況?或者我可以如何確定什麼是阻止UI線程,如果這是發生了什麼?

編輯:好的,只是嘗試註釋掉一切除了super.onCreate()和的setContentView() - 問題仍然存在。它不會與其他任何活動發生,但這是一個,但有這一個沒有。 :/

+0

技術上有可能阻止UI線程W /'SharedPreferences',但我猜它可能不作爲可能的網絡接入或東西。你有沒有試圖以某種方式去除它? – 2012-07-12 04:09:24

+0

@AlexLockwood感謝您的想法。剛剛嘗試過;刪除了任何SharedPreferences的所有引用,將我的onPause()和onResume()註釋掉了,但沒有區別。 – kcoppock 2012-07-12 04:25:28

+0

kcoppock也看到我的問題http://stackoverflow.com/questions/30053090/flash-toggle-button-crash-android – Nepster 2015-05-05 12:43:00

回答

12

哎呀。其中一個很難在試錯之外進行診斷,但我已經知道了。作爲參考,如果其他人有這個問題,它在我的佈局中歸結爲一個自定義視圖。在佈局過後,我添加了一個ViewTreeObserver.OnGlobalLayoutListener()做一些佈局修改,但在該監聽器中,我修改了佈局,從而導致了另一個佈局,實質上創建了一個無限循環(但不知何故不會導致ANR)。我的解決辦法是,像這樣:

private class BoardLayoutListener implements OnGlobalLayoutListener { 
    @Override 
    public void onGlobalLayout() { 
     //...do stuff here 

     //REMOVE this listener so that you don't repeat this forever 
     ViewTreeObserver obs = SudokuBoard.this.getViewTreeObserver(); 
     obs.removeGlobalOnLayoutListener(this); 
    } 
} 

該解決方案是非常具有諷刺意味的,考慮到我的second highest rated answer on StackOverflow這個專門處理。 :P

嘆息

+8

haha​​hah ...不用擔心,幾周前我正在閱讀關於SO的答案,還有一個他們是特別啓發,所以我去upvote ......原來我回答了1.5年前的問題,我不記得一件事:P – 2012-07-12 14:25:21

+0

哈哈,真棒! :P – kcoppock 2012-07-12 14:25:54

+1

這就是爲什麼沒有AnR:https://groups.google.com/forum/?fromgroups=#!topic/android-developers/TfkPlN5b-ig(謝謝戴安娜媽媽) – Reno 2013-03-29 06:16:17

1

我有同樣的問題,但今天它變成了有不同的原因和解決辦法,我決定在這裏添加的信息,以防萬一它可能會幫助別人。
在我的情況問題造成的,因爲我有我的onActivityResult()方法內以下行:
android.os.Debug.waitForDebugger();
我剛剛刪除的行,問題就消失了。 這行通常用於同步調試器與操作系統線程,但我只是覺得它不應該在任何地方使用。奇怪的是,直到我把我的手機從桌面上斷開後纔出現問題。

問候