2014-03-06 33 views
2
runOnUiThread(new Runnable(){ 

    @Override 
    public void run() { 

     System.out.println("print out from runOnUIThread."); 
    } 

}); 

System.out.println("print out in main thread."); 


的Android runOnUiThread执行顺序

**Output:** 
print out from runOnUIThread. 
print out in main thread. 



基本上runOnUiThread将在后台线程中使用,我只测试这样做。

上述代码在ActivityonCreate方法中执行。

从输出结果不是我所期望的。我在想,因为runOnUiThreadrunnable块发布到主线程,并且当前的执行上下文已经在主线程中,所以runOnUiThread应该在“在主线程中打印出”之后安排,但为什么结果不显示像那?我是否错误地解释了它?任何人都可以解释一下吗?


编辑:

哦,我应该首先阅读API。不管怎样,为什么这让我困惑,是因为,在iOS上,类似的机制不同的表现:

dispatch_async(dispatch_get_main_queue(), ^{ 
      NSLog(@"Main thread from Dispatch."); 
}); 

NSLog(@"Main thread."); 

的上述反向输出。

+0

那么,你实际上在后台线程上使用'runOnUiThread()'?如果不是,那么该方法将简单地在当前主线程上运行'Runnable'的'run()'方法。 – Luksprog

回答

4

runOnUiThread:在UI线程上运行指定的操作。 如果当前线程是UI线程,则立即执行该动作。如果当前线程不是UI线程,则该操作将被发布到UI线程的事件队列中。

Activity onCreate()方法也在UI线程中运行。首先runOnUiThread代码将运行其余的代码。

2

Referenced

要当你想更新从非UI线程的UI使用runOnUiThread()。即如果你想从后台线程更新你的用户界面。你也可以使用Handler来做同样的事情。它在UI线程上运行指定的操作。如果当前线程是UI线程,那么该动作立即执行。如果当前线程不是UI线程,则该操作将被发布到UI线程的事件队列中。

UIThread是您的应用程序执行的主要线程。这是大多数应用程序代码运行的地方。您在此线程中创建了所有应用程序组件(活动,服务,ContentProviders,BroadcastReceivers),并且在此线程中执行对这些应用程序的任何系统调用。

例如,可以说你的应用程序是一个单独的Activity类。然后,所有生命周期方法和大部分事件处理代码都在此UIThread中运行。这些方法如OnCreate,OnPause,OnDestroy,OnClick等。此外,这是对UI进行的所有更新。任何导致UI被更新或更改的事情都必须在UI线程上发生。

当你明确地产生一个新的线程在后台工作时,这段代码不会在UIThread上运行。那么如果这个后台线程需要做一些改变用户界面的事情会发生什么呢?这就是runOnUiThread的用途。其实你应该使用Handler; HERE它为这些后台线程提供了执行可以修改UI的代码的能力。他们通过将UI修改代码放入Runnable对象并将其传递给RunOnUiThread方法来实现此目的。