【问题标题】:What is the Android UiThread (UI thread)什么是Android UiThread(UI线程)
【发布时间】:2011-04-08 19:54:24
【问题描述】:

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

public final void runOnUiThread(可运行动作)

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

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

谢谢

【问题讨论】:

    标签: android ui-thread


    【解决方案1】:

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

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

    For more info on your application's Processes and Threads click here.

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

    For more info on spawning worker threads and updating the UI from them click here

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

    For more info on testing and running code on the UIThread click here

    【讨论】:

    • 很好的解释,特别是应用程序基础的链接,对于像我这样的初学者来说,它是必读的:)
    • 在大多数情况下,您不应该使用AsyncTask 而不是runOnUiThread 吗?
    • @JDJ 这两种技术有不同的目的:AsyncTask 会让你离开主线程,进入后台; runOnUiThread() 会让你从后台进入主线程。所以这取决于你想要完成什么。
    【解决方案2】:

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

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

    onPostExecutedoInBackground 返回后自动调用。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 你能否在非 UI 线程中准备小部件数据结构(如膨胀布局),然后稍后在 UI 线程中绘制它们?
      • 从未尝试过,但从技术上讲它应该是可能的,因为 inflate 只是创建数据结构。当您附加到活动等时,它的部分是您需要在 UIThread 上下文中执行此操作。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-15
      • 2014-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多