6

ActivityのライフサイクルとUIスレッドの処理について質問です。onCreateメソッドでHandlerを生成し、ログを表示する処理をpostしたところ、実行した際に、onResumeの後にログが表示されました。これは、ログを表示する処理がUIスレッドのMessage queueに追加されるより前に、Message queueにonRsumeの処理があるということでしょうか?Handlerでpostした処理が実行されるタイミングがいまいちわかりません。

pp pet
  • 103
  • 7
  • ご回答ありがとうございます。onCreateからonResumeまでがひとつのキューイングされた処理であるというのは勉強になりました。 – pp pet Oct 11 '16 at 11:43

1 Answers1

6

はい、その認識で正しいです。

Handler は生成したスレッド (ここでは UI スレッド) の Looper に処理をキューイングします。

onCreate() で追加した Message より先に onResume() が呼ばれるのがなぜかというと、

  • Activity の起動処理もまた、UI スレッドにキューイングされている処理であること
  • onCreate() のコールスタックを辿り、ActivityThread#handleLaunchActivity()メソッドの処理を読むこと

で分かります。説明に必要最低限な処理を抜き出すと以下になります。

// ここで onCreate() が呼び出されます
Activity a = performLaunchActivity(r, customIntent);
if (a != null) {
    r.createdConfig = new Configuration(mConfiguration);
    Bundle oldState = r.state;
    // ここで onResume() が呼び出されます
    handleResumeActivity(r.token, false, r.isForward, !r.activity.mFinished && !r.startsNotResumed);
    // 以下略
}

onCreate() の呼び出しと、onResume() の呼び出しはひとつのキューイングされた処理の中で行なわれているのです。

これらの処理が終わって初めて次のメッセージが取り出されるので、Handler#post() した内容は、onResume() の後で実行されます。

quesera2
  • 5,574
  • 1
  • 16
  • 41