什么是Android UiThread(UI线程)


81

有人可以向我解释一下UI线程到底是什么吗?在developer.android.com上说到runOnUiThread函数

public final void runOnUiThread(可运行操作)

从以下版本开始:API级别1在UI线程上运行指定的操作。如果当前线程是UI线程,则立即执行该操作。如果当前线程不是UI线程,则将操作发布到UI线程的事件队列。

UI线程是否意味着每次通过诸如呼叫或屏幕变暗等ui活动将活动推到后台时,都将运行该线程?如果不是,那么UI线程到底包含什么?

谢谢

Answers:


143

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

例如,假设您的应用程序是单个Activity类。然后,所有生命周期方法和大多数事件处理代码都在此UIThread中运行。这些都是类似的方法onCreateonPauseonDestroyonClick,等。此外,这是所有的更新到用户界面制成。导致UI更新或更改的任何事情都将在UI线程上发生。

有关应用程序的进程和线程的更多信息,请单击此处。

当您显式产生一个新线程以在后台工作时,该代码不会在UIThread上运行。那么,如果该后台线程需要做一些改变UI的事情会发生什么呢?这就是runOnUiThread它的用途。实际上,您应该使用Handler(有关更多信息,请参见下面的链接)。它为这些后台线程提供了执行可以修改UI的代码的功能。他们通过将修改UI的代码放在Runnable对象中并将其传递给runOnUiThread方法来实现。

有关生成工作线程并从中更新UI的更多信息,请单击此处。

我个人仅runOnUiThread在“仪器测试”中使用该方法。由于测试代码不在UIThread中执行,因此您需要使用此方法来运行修改UI的代码。因此,我用它来将点击和按键事件注入到我的应用程序中。然后,我可以检查应用程序的状态,以确保发生正确的事情。

有关在UIThread上测试和运行代码的更多信息,请单击此处。


3
很棒的解释,特别是应用程序基础知识的链接,它是所有像我这样的初学者都必须阅读的:)
Java学生

1
在大多数情况下,您不应该使用AsyncTask而不是runOnUiThread吗?
JDJ 2014年

5
@JDJ这两种技术有不同的用途:AsyncTask将您从主线程中移出,进入后台;runOnUiThread()将使您从后台进入主线程。因此,这取决于您要完成的工作。
理查德·勒·马修里尔

10

如果在单独的线程中执行阻止代码(例如Http-Request),请考虑使用AsyncTask。它的doInBackground-Method在单独的线程上运行。AsyncTask为您提供了方法onProgressUpdateonPostExecute保证在UI线程上运行

如果您需要GUI的进度更新(例如通过进度条)调用publishProgressdoInBackground。这导致随后的调用onPublishProgress也可以保证在UI线程上运行

onPostExecutedoInBackground返回后会自动调用。


4

所有UI绘图等均发生在单独的线程中。它称为UIThread。如果要对UI进行任何更改,则必须使用UI并确保它发生在UIThread的上下文中。最简单的方法是利用runOnUiThread


您可以在非UI线程中准备小部件数据结构(例如为Layout充气),然后在UI线程中绘制它们吗?
SMBiggs

从来没有尝试过,但是从技术上讲应该是可能的,因为inflate只会创建数据结构。当您附加到活动等时,它是您需要在UIThread上下文中进行操作的部分。
the100rabh 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.