按顺序执行处理程序的事项

Matter of Handlers execution in a sequence

我从一个解释处理程序的网站上截取了 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();

从第二次执行Handler输出的任务来看,是

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

看来这篇文章的作者非常确定第二个 Handler 将最后执行。

我的问题是,第二个 Handler 是否会在第一个 Handler 完成其工作后最后执行。虽然,当我多次 运行 时,是的,它是最后执行的。在我看来,由于 Handler 是在后台 Thread 完成的,因此我们不应该知道(甚至预测)Handler 将首先执行这两个任务中的哪一个。我需要一个解释,提前谢谢你。

My question is that whether it's true that the second handler will be executed last just after the first handler finishes its job.

一个 Handler 实例关联到单个 Thread(也称为 消息队列 )。

Runnable 在此 Thread 上按顺序执行。

调用 post() 会将 Runnable 放在该队列的末尾,所以是的,第二个 Runnable 将在第一个之后执行。

没有两个处理程序在运行,UI 线程 (mUiHandler) 上只有一个处理程序。您的辅助线程正在创建 Runnable 对象并将它们发布到 Handler。它们将由处理程序按照它们发布的顺序执行。由于线程的循环首先执行并发布,然后线程通过发布 "second" Runnable 完成,相对于循环中发布的其他内容,第二个将始终最后执行。

最外层的匿名 Runnable,即传递给 new Thread(...) 构造函数的那个​​,是后台线程中的 运行s。 运行nable 中的所有内容都将按顺序执行 - 一条指令接一条指令。

因为 运行nable 有一个 for 循环,只有在那之后最后的 toast 出现,你保证它会 运行 在循环体之后。