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();
我刚刚删除的行,问题就消失了。 这行通常用于同步调试器与操作系统线程,但我只是觉得它不应该在任何地方使用。奇怪的是,直到我把我的手机从桌面上断开后才出现问题。

问候