2

私の質問は... startActivity() の後にコードを実行しようとすると、現在のアクティビティの onPause() が呼び出される前に完全に実行されますか? つまり、startActivity() を含むメソッドが最後に到達したときに実際に呼び出されるかどうかはわかりません (メソッドで発生する何かfinish())。

detach()いくつかの条件に基づいて新しいアクティビティが開始された後にオブジェクト (データベース接続を持つ) が必要な例がありますが、1 つの条件を評価するにはこのオブジェクトが必要です。detach()その条件を確認し、最初の の前にブール値とそれを保存できることはifわかっていますが、次のコードが「合法」かどうかを知りたいです。

ありがとう!

protected void onListItemClick(ListView l, View v, int position, long id) {
    super.onListItemClick(l, v, position, id);
    School selectedSchool = new School((Cursor)l.getItemAtPosition(position));
    mSharedPreferences.edit()
    .putLong(DatabaseManager.SCHOOL_ID, selectedSchool.getIdOpenErp())
    .commit();
    School.SchoolManager schoolManager = new School.SchoolManager(this);
    Long[] sessionIdsOpenErpOfSelectedSchool = schoolManager.getSessionIdsOpenErp(selectedSchool);
    if (sessionIdsOpenErpOfSelectedSchool.length > 0) {
        if (schoolManager.isPreviousWorkingSchoolPresent()) { // line 10
            Intent iParticipationManagement = new Intent(this, ParticipationManagement.class);
            startActivity(iParticipationManagement);
        } else {
            Intent iSelectExistingSession = new Intent(this, SelectExistingSession.class);
            startActivity(iSelectExistingSession);
        }
    } else {
        Intent iSelectNewSession = new Intent(this, SelectNewSession.class);
        startActivity(iSelectNewSession);
    }
    // The following line will be executed after one of the startActivity() methods is called...
    // Is this legal? Or should I get the value from isPreviousWorkingSchoolPresent() (at line 10)
    // before the first if and do the detach() there as well?
    schoolManager.detach();
}
4

3 に答える 3

5

への呼び出しを含むメソッドで実行したいものはすべて、 への呼び出しを受け取るstartActivity()に実行されます。問題は、アプリケーションはデフォルトで 1 つのメイン スレッドを使用し、その上で への呼び出しやその他のライフサイクル メソッドが発生するということです。したがって、このスレッドはメソッド内のコードの実行でビジー状態ですが、他の処理はできません。onPause()onPause()

これは、メソッドが他のスレッドで実行された場合にのみ問題になります。ただし、このメソッドは UI イベントをリッスンするために使用されるため、そうではありません。そのため、常にメイン スレッドから呼び出されると想定しています。

于 2012-03-08T14:57:48.723 に答える
3

Android ソースをざっと見てみると、コードがメイン イベント スレッドで実行されている場合 (この場合は true のように見えます)、onPause() が呼び出される前に実行が完了することがわかります。

ただし、次のアクティビティに移行するときのアプリの応答性に影響を与える可能性があるため、完了するまでに数ミリ秒以上かかる可能性があるコードを実行しないことをお勧めします。

于 2012-03-08T14:57:35.493 に答える
1

メイン イベント ループ、つまり、UI スレッドはタッチ イベントだけでなく、アクティビティ ライフ サイクル コールバックも処理します。新しいアクティビティが開始されると、アクティビティ ライフ サイクル コールバック onCreate()、onStart()、onResume() がイベント キューに追加されて待機します。また、タッチ イベントも同じイベント キューに追加され、すべてのコードが単一のメイン スレッドで実行されます。

コードで startActivity() を呼び出すと、アクティビティは onCreate()、onStart()、onResume() をコールバックするか、メイン イベント キューにプッシュされ、キュー内の前のメソッドが実行されるまで実行されないことを理解してください。次のアクティビティはすぐには開始されませんが、現在のメソッド、つまり startActivity() の後のコードを実行した後にのみ実行されるアクティビティ コールバックをキューに入れ、次のアクティビティが読み込まれると、現在のアクティビティの onPause() がプッシュされます待ち行列に。

アクティビティのライフサイクルの 画像リンクを見ると、別のアクティビティが読み込まれると onPause が呼び出されます

于 2016-07-21T07:09:55.367 に答える