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();

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

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

似乎文章的作者非常确定第二个Handler将最后执行。

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

4

3 回答 3

3

我的问题是,第二个处理程序是否会在第一个处理程序完成其工作后最后执行。

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

Runnables 在此Thread按顺序执行。

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

于 2016-09-07T11:28:01.557 回答
1

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

于 2016-09-07T11:28:36.473 回答
1

最外面的匿名Runnable,传递给new Thread(...)构造函数的,是在后台线程中运行的。该可运行文件中的所有内容都将按顺序执行——一条又一条指令。

由于该 runnable 有一个for循环,并且只有在最后一个 toast 出现之后,您才能保证它会在循环体之后运行。

于 2016-09-07T11:28:44.007 回答