什么是Android UiThread(UI线程)

use*_*885 78 android ui-thread

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

public final void runOnUiThread(Runnable action)

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

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

谢谢

pla*_*mbo 139

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

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

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

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

有关产生工作线程和更新UI的更多信息,请单击此处

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

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

  • @JDJ这两种技术有不同的用途:`AsyncTask`会让你关闭主线程,进入后台; `runOnUiThread()`将从后台获取ONTO主线程.所以这取决于你想要完成的事情. (4认同)
  • 很棒的解释,特别是应用程序基础的链接,这是我必须阅读的所有初学者:) (3认同)

Mar*_*bst 9

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

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

onPostExecutedoInBackground返回后自动调用.


the*_*abh 5

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