8

WAY1:

@Override
protected void onPause() {
    super.onPause();
    // do something urgent
    doSomething();
}

WAY2:

@Override
protected void onPause() {
    // do something urgent
    doSomething();
    super.onPause();
}

doSomething()違いは、との呼び出しシーケンスですsuper.onPause()WAY1を使用すると、doSomething()コストが高すぎるとエラーが発生します: W/ActivityManager( 4347): Activity pause timeout for ActivityRecord

WAY2pause timeoutを使用するとエラーを回避できますか?

AOSP を確認しましたが、Activity の呼び出し手順がわかりにくかったです。

4

2 に答える 2

7

ドキュメントによると、

アクティビティが実際に停止している場合に、ユーザーの次の目的地への迅速な移行を可能にするために、onPause() メソッドで実行される操作の量を比較的単純に保つ必要があります。

ActivityStack「アクティビティの単一スタックの状態と管理」に使用されるクラスを見ると、定義されています。

// How long we wait until giving up on the last activity to pause.  This
// is short because it directly impacts the responsiveness of starting the
// next activity.
static final int PAUSE_TIMEOUT = 500;

そのため、 で実行された操作onPause()がこのタイムアウトを超えると、メッセージが表示されますActivity pause timeout

このタイムアウトはアクティビティの一時停止に対して設定され、onPause()アクティビティが一時停止したときに操作を実行できるコールバック メソッドにすぎないため、順序 (WAY1 または WAY2) を変更してもタイムアウトには影響しません (WAY1 と WAY2 の両方でトリガーされます)。 WAY2)。それを証明するために、これらのコードは両方ともActivity pause timeoutメッセージを出力します。

// WAY1
@Override
protected void onPause() {
    super.onPause();

    try {
        Thread.sleep(501); // Don't do this!!! Only for testing purposes!!!
    }catch (Exception e) {
    }
}

// WAY2
@Override
protected void onPause() {
    try {
        Thread.sleep(501); // Don't do this!!! Only for testing purposes!!!
    }catch (Exception e) {
    }

    super.onPause();
}

補足として、私のコメントで述べているように、ドキュメントには、常に最初にスーパークラス メソッドを呼び出す必要があると記載されていますが、@ankit aggarwal が述べているように、onPause、onStop、および onDestroy メソッドでスーパークラス メソッドを呼び出す正しい順序は何ですか? なぜ?WAY2がWAY1よりも優れているかどうか、およびその理由を説明する非常に良い答えです。

于 2016-03-09T14:53:49.383 に答える