Android runOnUiThread执行序列

时间:2014-03-06 07:19:08

标签: java android multithreading

runOnUiThread(new Runnable(){

    @Override
    public void run() {

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

});

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


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



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

上述代码以Activity onCreate方式执行。

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


编辑:

哦,我应该先阅读API。无论如何,为什么这让我感到困惑是因为,在iOS中,类似的机制表现不同:

runOnUiThread

上述输出相反。

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:2)

Referenced

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

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

例如,假设您的应用程序是一个Activity类。然后,所有生命周期方法和大多数事件处理代码都在此UIThread中运行。这些是 OnCreate,OnPause,OnDestroy,OnClick 等方法。此外,这是对UI进行所有更新的地方。任何导致UI被更新或更改的东西都会在UI线程上发生。

  

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