在工作线程的UI线程上使用变量

时间:2013-09-09 15:58:09

标签: android thread-safety runnable

Android开发者网站指出,在UI线程中工作时必须遵循两条规则,即

  1. 不要阻止UI线程

  2. 不要从UI线程外部访问Android UI工具包*

  3. 这是否意味着我可以从工作线程中访问UI线程中的变量,即不是UI工具包?

    如果是这样,如果变量不断更新(例如,来自SensorEventListener),则需要给出任何特殊注意事项。感谢。

4 个答案:

答案 0 :(得分:2)

  

这是否意味着我可以从工作线程中访问UI线程中的变量,即不是UI工具包?

是的,只要将它们声明为成员变量,就可以访问它们。您甚至可以访问UI元素中的值,例如在getText()上使用TextView,您无法更新任何UI元素。

  

如果要不断更新变量,需要给出任何特殊注意事项,

如果要更新它们,那么您可能希望有一种同步变量的方法。执行此操作的好方法是使用AsyncTask并更新onPostExecute()中的变量。

如果您不熟悉使用AsyncTask,请务必多次查看the Docs并了解它们。

答案 1 :(得分:0)

不,您无法在UI线程外访问它们。很少有UI元素可以从非UI线程访问,其中一个是ProgressBar。

答案 2 :(得分:0)

您可以在单独的线程中访问UI元素,但无法更新它们

在非UI线程中更新UI元素的唯一方法是使用runOnUiThread或使用除Handler之外的{{1}}来回调单独线程中的UI线程无法在单独的线程中对UI元素进行更改

答案 3 :(得分:-1)

不能在UiThread外部访问变量。如果您想在UiThread之外进行修改:

  • Activity.runOnUiThread(Runnable)

  • 一些“post”方法,用于存储等待UiThread处理它们的修改。例如,您可以使用BlockingQueue。查看java.util.concurrent

  • 在一些非常罕见的情况下,修改UiThread外部的变量不会产生错误,在这种情况下,可以安全地从UiThread访问它。在其他情况下,变量应该是私有的,并且尝试在UiThread之外访问变量应该会引发IllegalStateException或类似的事情。