1

このスニペットは、Android のハンドラー (スレッド処理) を説明しているサイトから取得しました。

  @Override
       protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);

          Thread myThread = new Thread(new Runnable() {
             @Override
             public void run() {
                for (int i = 0; i < 4; i++) {
                   try {
                      TimeUnit.SECONDS.sleep(2);
                   } catch (InterruptedException e) {
                      e.printStackTrace();
                   }
                   if (i == 2) {

                      mUiHandler.post(new Runnable() {
                         @Override
                         public void run() {
                            Toast.makeText(MyActivity.this, "I am at the middle of background task",
                                Toast.LENGTH_LONG)
                                .show();
                         }
                      });
                   }
                }//ends for()

               // THE SECOND HANDLER, RIGHT HERE!
                mUiHandler.post(new Runnable() {
                   @Override
                   public void run() {
                      Toast.makeText(MyActivity.this,
                          "Background task is completed",
                          Toast.LENGTH_LONG)
                          .show();
                   }
                });
             } //ends run()
          });
          myThread.start();

2 番目に実行されたタスクで出力されたタスクから判断するとHandler

 Toast.makeText(MyActivity.this,
                      "Background task is completed",
                      Toast.LENGTH_LONG)
                      .show();

記事の執筆者は、2 番目Handlerが最後に実行されることを確信しているようです。

私の質問は、最初のジョブが終了しHandlerた直後に 2 番目が最後に実行されるというのが本当かどうかということです。Handlerただし、複数回実行すると、最後に実行されます。私の考えでは、Handlerはバックグラウンドで実行されるためThread、これら 2 つのタスクのどちらHandlerが最初に実行されるかを知ること (予測することさえ) は想定されていません。説明が必要です、事前に感謝します。

4

3 に答える 3

3

私の質問は、最初のハンドラーがジョブを終了した直後に 2 番目のハンドラーが最後に実行されるというのは本当かどうかということです。

Handlerインスタンスは、単一の(メッセージ キューThreadとも呼ばれる) に関連付けられます。

Runnables は、これに対してThread順次実行されます。

を呼び出すpost()Runnable、そのキューの最後に配置Runnableされるため、2 番目は最初のキューの後に実行されます。

于 2016-09-07T11:28:01.557 に答える
1

実行中のハンドラは 2 つではなく、UI スレッドのハンドラが 1 つだけです ( mUiHandler)。セカンダリ スレッドは、Runnableオブジェクトを作成し、それらを に投稿していHandlerます。それらは、ポストされた順序でハンドラーによって実行されます。スレッドのループが最初に実行されてポストされるため、スレッドは "second" をポストして終了しますRunnable。その 2 番目のループは、ループ内でポストされる他のものと比較して、常に最後に実行されます。

于 2016-09-07T11:28:36.473 に答える
1

Runnableコンストラクターに渡される最も外側の anonymousnew Thread(...)は、バックグラウンド スレッドで実行されます。そのランナブル内のすべてが順番に実行されます。つまり、命令が次々と実行されます。

そのランナブルにはforループがあり、その後にのみ最後のトーストが表示されるため、ループ本体の後に実行されることが保証されます。

于 2016-09-07T11:28:44.007 に答える