首页 文章

什么是Android UiThread(UI线程)

提问于
浏览
73

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

public final void runOnUiThread(Runnable action)从:API Level 1在UI线程上运行指定的操作 . 如果当前线程是UI线程,则立即执行该操作 . 如果当前线程不是UI线程,则将操作发布到UI线程的事件队列 .

UI线程是否意味着每次通过某些ui活动(如来电或屏幕调暗等)将活动推送到后台时都会运行此线程?如果没有,UI线程到底包含什么?

谢谢

3 回答

  • 9

    UIThread是应用程序的主要执行线程 . 这是运行大多数应用程序代码的地方 . 您在此线程中创建了所有应用程序组件(Activities,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

  • 135

    如果在单独的线程中执行阻塞代码(例如Http-Request),请考虑使用AsyncTask . 它的 doInBackground -Method在一个单独的Thread上运行 . AsyncTask 为您提供了方法 onProgressUpdateonPostExecute ,它们是 guaranteed to run on the UI thread .

    如果您需要GUI进度更新(例如通过进度条),请在 doInBackground 内调用 publishProgress . 这导致随后调用 onPublishProgress .

    onPostExecutedoInBackground 返回后自动调用 .

  • 4

    所有UI绘图等都在一个单独的线程中发生 . 它叫做UIThread . 如果你想对UI做任何改变你必须使用确保它发生在UIThread的上下文中 . 最简单的方法是使用 runOnUiThread

相关问题