89

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

public final void runOnUiThread(可运行操作)

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

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

谢谢

4

3 回答 3

149

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

例如,假设您的应用程序是单个 Activity 类。然后所有生命周期方法和大部分事件处理代码都在这个 UIThread 中运行。这些是 , , , 等方法onCreateonPause此外onDestroyonClick这是对 UI 进行所有更新的地方。任何导致 UI 更新或更改的事情都必须在 UI 线程上发生。

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

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

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

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

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

于 2010-09-06T18:13:29.893 回答
10

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

如果您需要 GUI 进度更新(例如通过进度条),请publishProgressdoInBackground. 这导致后续调用onPublishProgress保证在 UI 线程上运行

onPostExecute返回后自动调用doInBackground

于 2014-02-05T13:57:23.520 回答
5

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

于 2010-09-06T15:48:25.450 回答