ActivityRecord的活动空闲超时

时间:2012-07-12 03:26:55

标签: android performance android-activity android-activityrecord

所以我有一个奇怪的问题,我不完全确定我应该提供的所有信息,但我会尽我所能 - 如果我需要添加更多信息,请告诉我。我遇到了一个问题,当我完成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()之外的所有 - 问题仍然存在。任何其他活动都不会发生这种情况,但是这个活动没有任何东西。 :/

2 个答案:

答案 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线程同步,但我认为不应该在任何地方使用它。奇怪的是,直到我将手机与桌面断开连接才会出现问题。

此致