所以我有一个奇怪的问题,我不完全确定我应该提供的所有信息,但我会尽我所能 - 如果我需要添加更多信息,请告诉我。我遇到了一个问题,当我完成Activity
并返回上一个Activity
(或使用新的Intent
启动它)时,问题似乎集中于完成Activity
{1}})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()
方法,看看它是否有任何区别,但事实并非如此。
Activity
不产生任何后台线程,不执行任何网络活动,它唯一的磁盘访问是对SharedPreferences
的访问。我之前能够找到的问题是关于HistoryRecord
的空闲超时,而不是ActivityRecord
。
任何想法会导致什么?或者我如何确定阻止UI线程的内容,如果发生了什么?
编辑:好的,只是尝试评论除了super.onCreate()和setContentView()之外的所有 - 问题仍然存在。任何其他活动都不会发生这种情况,但是这个活动没有任何东西。 :/
答案 0 :(得分: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
叹息
答案 1 :(得分:1)
我今天遇到了同样的问题,但事实证明我有不同的原因和解决方案,我决定在这里添加信息,万一它可以帮助别人。
在我的情况下,问题是由于我在onActivityResult()
方法中有以下行而引起的:
android.os.Debug.waitForDebugger();
我刚刚删除了该行,问题就消失了。
这一行通常用于将调试器与OS线程同步,但我认为不应该在任何地方使用它。奇怪的是,直到我将手机与桌面断开连接才会出现问题。
此致