android – ActivityRecord的活动空闲超时

所以我有一个奇怪的问题,我不完全确定我应该提供什么信息,但我会尽我所能 – 只要让我知道,如果我需要添加更多的信息.我有一个问题,当我完成我的活动并返回到上一个活动(或启动它与一个新的意图 – 问题似乎集中在完成活动)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

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...