所以我有一个奇怪的问题,我不完全确定我应该提供什么信息,但我会尽我所能 – 只要让我知道,如果我需要添加更多的信息.我有一个问题,当我完成我的活动并返回到上一个活动(或启动它与一个新的意图 – 问题似乎集中在完成活动)UI性能急剧下降大约六七秒,然后恢复正常.
从LogCat,这个警告一直显示:
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性能恢复正常.直到那时,这是非常缓慢的.我没有代码,我知道这可能阻止主线程,我甚至已经去评论我的整个onPause()方法,看看它是否有所不同,而不是.
活动不产生任何后台线程,不执行任何网络活动,唯一的磁盘访问它是一些访问SharedPreferences.以前我能找到的问题是关于HistoryRecord的空闲超时,而不是ActivityRecord.
任何想法会造成什么?或者我可以如何确定什么是阻止UI线程,如果这是发生了什么?
编辑:好的,只是尝试注释掉除super.onCreate()和setContentView()之外的所有内容 – 问题仍然存在.这不是任何其他活动,而是这一个,但是没有这个. :/
解决方法
哦geez其中一件事情在测试和错误之外很难诊断,但我已经弄清楚了.作为参考,如果任何人有这个问题,它在我的布局中归结为一个自定义视图.我已经添加了一个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
叹