9

所以我有一个奇怪的问题,我不完全确定我应该提供哪些信息,但我会尽力而为——如果我需要添加更多信息,请告诉我。我有一个问题,当我完成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}

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

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

有什么想法会导致这种情况吗?或者我如何确定是什么阻塞了 UI 线程,如果这是正在发生的事情?

编辑:好的,只是尝试注释掉除了super.onCreate () 和 setContentView() 之外的所有内容——问题仍然存在。它不会发生在除此之外的任何其他活动中,但没有任何其他活动。:/

4

2 回答 2

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);
    }
}

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

于 2012-07-12T05:07:49.650 回答
1

我今天遇到了同样的问题,但结果证明有不同的原因和解决方案,我决定在此处添加信息,以防万一它可能对其他人有所帮助。
就我而言,问题是由于我的onActivityResult()方法中有以下行引起的:
android.os.Debug.waitForDebugger();
我刚刚删除了该行,问题就消失了。该行通常用于将调试器与操作系统线程同步,但我只是认为它不应该在任何地方使用。奇怪的是,直到我将手机与桌面断开连接后,问题才会出现。

问候

于 2014-12-09T01:28:45.747 回答