什么是Android的UiThread(UI线程)?

90

请问什么是UI线程?在developer.android.com上,runOnUiThread函数的描述是:

public final void runOnUiThread (Runnable action)

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

UI线程是否意味着每次活动被一些UI活动(如来电或屏幕变暗等)推到后台时都会运行它?如果不是,UI线程具体包括什么?

谢谢

3个回答

150

UIThread是应用程序的主线程,它执行大多数应用程序代码。所有应用程序组件(Activities、Services、ContentProviders、BroadcastReceivers)都是在此线程中创建的,对这些组件的任何系统调用也是在此线程中执行。

例如,假设您的应用程序只有一个Activity类,则此UIThread中运行所有生命周期方法和大部分事件处理代码。这些方法包括onCreateonPauseonDestroyonClick等。此外,所有更新UI的操作都要在此线程中完成。任何需要更新或更改UI的操作必须在UIThread中进行。

点击此处了解有关应用程序进程和线程的更多信息。

当您显式地生成一个新线程来后台处理工作时,此代码不会在UIThread中运行。那么如果此后台线程需要执行一些更改UI的操作呢?这就是runOnUiThread的作用。实际上,您应该使用Handler(有关此项的更多信息请参见下面的链接)。它为这些后台线程提供了执行能够修改UI的代码的能力。它们通过将修改UI的代码放入Runnable对象,并将其传递给runOnUiThread方法来完成这一操作。

要了解更多关于生成工作线程和从它们更新UI的信息,请单击此处。

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

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


3
非常好的解释,特别是应用基础的链接,对于像我这样的初学者来说,它是必读的 :) - user2088260
1
在大多数情况下,你不应该使用runOnUiThread而是应该使用AsyncTask,对吧? - JDJ
5
@JDJ,这两种技术有不同的用途:AsyncTask 可以使你脱离主线程,进入后台;而 runOnUiThread() 则可以使你从后台回到主线程。所以这取决于你想要实现什么目标。 - Richard Le Mesurier

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

如果您需要GUI进度更新(例如通过进度条),请在doInBackground内调用publishProgress。这会导致对onPublishProgress的后续调用,该方法也保证在UI线程上运行

onPostExecutedoInBackground返回后自动调用。


5

所有的UI绘制等操作都在一个单独的线程中进行,称为UIThread。如果您想对UI进行任何更改,必须确保它发生在UIThread的上下文中。

最简单的方法是利用runOnUiThread


你能否在非 UI 线程中准备小部件数据结构(例如填充布局),然后在 UI 线程中稍后绘制它们? - SMBiggs
从技术上讲,我从未尝试过,但理论上应该是可行的,因为inflate只是创建数据结构。当您将其附加到活动等时,需要在UIThread上下文中执行。 - the100rabh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接