处理程序执行顺序的问题

时间:2016-09-07 11:18:53

标签: android android-handlerthread

我从一个解释Android处理程序的网站(一个线程化的东西)中获取了这个snipet。

  @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首先执行的那两个任务中的哪一个。我需要一个解释,谢谢你。

3 个答案:

答案 0 :(得分:2)

  

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

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

Runnable按顺序执行此Thread

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

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