2010-09-06 84 views
69

有人可以向我解释什么是UI线程? 在developer.android.com它说,关于runOnUiThread功能什么是Android UiThread(UI线程)

公众最终无效runOnUiThread(Runnable的动作)

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

用户界面线程是否意味着每当该活动被某些UI活动(如来电或屏幕调光等)推动背景时,该线程就会运行?如果没有,那么UI线程究竟包含什么?

谢谢

回答

129

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

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

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

当你明确地生成一个新的线程来完成工作的背景下,此代码不能在UIThread运行。那么如果这个后台线程需要做一些改变用户界面的事情会发生什么呢?这是runOnUiThread的用途。其实你应该使用一个处理程序(参见下面的链接了解更多信息)。它为这些后台线程提供了执行可以修改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

+3

很好的解释,特别是应用程序基础的链接,它是必须为像我这样的初学者阅读:) – 2013-10-11 13:16:41

+1

在大多数情况下,你不应该使用'AsyncTask'而不是'runOnUiThread'吗? – JDJ 2014-06-12 16:55:07

+3

@JDJ这两种技术有不同的用途:'AsyncTask'会让你关闭主线程,进入后台; 'runOnUiThread()'会让你从背景中转到主线程。所以这取决于你想要完成的事情。 – 2015-01-28 06:55:35

3

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

+0

您可以在非UI线程中准备小部件数据结构(如膨胀布局),然后在UI线程中绘制它们吗? – 2012-07-21 06:31:40

+0

从来没有尝试过,但技术上它应该是可能的,因为膨胀只是创建数据结构。当你需要在UIThread上下文中执行它时,它所附带的部分就是活动等。 – the100rabh 2012-07-22 06:10:15

8

如果执行阻断代码(例如,http请求)在一个单独的线程,可以考虑使用AsyncTask。它的doInBackground-方法在一个单独的线程上运行。AsyncTask为您提供了保证在UI线程上运行的方法onProgressUpdateonPostExecute,它们是

如果您需要GUI的进度更新(例如通过进度条)调用publishProgressdoInBackground。这会导致后续调用onPublishProgress

onPostExecutedoInBackground返回后自动调用。