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
方式执行。
从输出中,结果不是我所期望的。我在想,因为runOnUiThread
将runnable
块发布到主线程,并且当前执行上下文已经在主线程中,所以{“1}}应该在”打印出来之后安排线程“,但为什么结果不显示那样?我是否错误地解释了它?任何人都可以解释一下吗?
编辑:
哦,我应该先阅读API。无论如何,为什么这让我感到困惑是因为,在iOS中,类似的机制表现不同:
runOnUiThread
上述输出相反。
答案 0 :(得分:4)
runOnUiThread:
在UI线程上运行指定的操作。 如果当前线程是UI线程,则立即执行操作。如果当前线程不是UI线程,则该操作将发布到UI线程的事件队列中。
Activity onCreate()
方法也在UI线程中运行。首先运行runOnUiThread
代码,然后运行其余代码。
答案 1 :(得分:2)
如果要从非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 方法来实现此目的。