ActivityRecord的活动空闲超时

kco*_*ock 9 performance android android-activity android-activityrecord

所以我有一个奇怪的问题,我不完全确定我应该提供的所有信息,但我会尽我所能 - 如果我需要添加更多信息,请告诉我.我有,当我完成我的一个问题Activity,并返回到前一个Activity(或一个新的启动它Intent-这个问题似乎在整理为中心Activity)的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}
Run Code Online (Sandbox Code Playgroud)

一旦活动超时,UI性能就会恢复正常.在那之前,它非常缓慢.我没有可以阻止主线程的代码,我甚至已经注释掉了我的整个onPause()方法,看它是否有任何区别,但事实并非如此.

Activity没有任何产卵后台线程,不执行任何网络活动,它具有唯一的磁盘访问的一些访问SharedPreferences.我之前能够找到的问题是关于空闲超时HistoryRecord,而不是ActivityRecord.

任何想法会导致什么?或者我如何确定阻止UI线程的内容,如果发生了什么?

编辑:好的,只是尝试注释掉除super.onCreate()和setContentView()之外的所有内容 - 问题仍然存在.它不与任何其他活动,但这个发生,但有什么可这一个.:/

kco*_*ock 12

哦,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);
    }
}
Run Code Online (Sandbox Code Playgroud)

这个解决方案非常具有讽刺意味,考虑到我在StackOverflow上的第二高评价答案专门处理这个问题.:P

  • 哈哈哈......别担心,几个星期前我正在读SO的答案,其中一个特别有启发性,所以我去了upvote ...结果我回答了1年前的问题,我不记得了一件事:P (8认同)