9

奇妙な問題が発生しました。どのような情報を提供すればよいか完全にはわかりませんが、最善を尽くします。さらに情報を追加する必要がある場合はお知らせください。終了Activityして前に戻ったときActivity(または新しいものを起動したときIntent- 問題は を終了することに集中しているようですActivity)、UI パフォーマンスが約 6 ~ 7 秒間大幅に低下し、その後に戻るという問題があります。正常。

から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

ああそうね。試行錯誤以外で診断するのはかなり難しいことの1つですが、私はそれを理解しました。参考までに、他の誰かがこの問題を抱えている場合、それは私のレイアウトのカスタムビューに帰着しました。レイアウトパスの後にいくつかのレイアウト変更を行うためにを追加しました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で2番目に評価の高い回答が特にこれを扱っていることを考えると、このソリューションは非常に皮肉なものです。:P

はぁ

于 2012-07-12T05:07:49.650 に答える
1

今日も同じ問題が発生しましたが、原因と解決策が異なることが判明したため、他の人の助けになる場合に備えて、ここに情報を追加することにしました.
私の場合、onActivityResult()メソッド内に次の行があったため、問題が発生
android.os.Debug.waitForDebugger();
しました。行を削除しただけで、問題はなくなりました。この行は通常、デバッガーを OS スレッドと同期するために使用されますが、どこでも使用すべきではないと考えました。奇妙なことに、電話をデスクトップから切断するまで問題は発生しませんでした。

よろしく

于 2014-12-09T01:28:45.747 に答える