2016-09-07 44 views
0

处理程序执行的我把这个snipet从网站中的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将首先执行完成。我需要一个解释,预先感谢你。

回答

1

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

由于该Runnable有for循环,只有最后的土司出现你保证它会循环主体后运行后。

+0

因此,它更可能是“任务的执行命令”,而不是“处理程序执行顺序”? –

+1

将处理程序视为线程间通信的一种方式。敬酒只能从“主”或“UI”线程显示。关于要求主线程运行一些代码的方法是通过处理程序。因此,代码会要求主线在“中间”敬酒之前,要求它敬酒“完成”。从技术上讲,如果主线程被阻塞,它可能会等待直到它运行这些请求,但无论如何它会按照它们收到的顺序处理它们。 – orip

+0

好吧,我明白了,基本上这些任务来自同一个线程,所以顺序依然很重要。 –

2

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

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

Runnable s的有关此Thread顺序执行。

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

1

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