【问题标题】:Using Variables on UI Thread from Worker Thread在工作线程的 UI 线程上使用变量
【发布时间】:2013-09-13 04:21:32
【问题描述】:

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

  1. 不要阻塞 UI 线程

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

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

如果是这样,如果变量不断更新,例如,从SensorEventListener 更新,是否需要给出任何特殊考虑。谢谢。

【问题讨论】:

    标签: android thread-safety runnable


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      您可以在非 UI 线程中更新 UI 元素的唯一方法是使用 runOnUiThread 或使用 Handler 在单独的线程中对 UI 线程进行回调,除此之外您无法更改单独线程中的 UI 元素

      【讨论】:

        【解决方案3】:

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

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

        如果变量不断更新,是否需要特别考虑,

        如果它们正在更新,那么您可能需要一种同步变量的方法。一个好的方法是使用AsyncTask 并更新onPostExecute() 中的变量。

        如果您不熟悉AsyncTask 的使用,请务必仔细阅读the Docs 并理解它们。

        【讨论】:

        • 谢谢。我实际上有一个正在更新成员变量的传感器侦听器。然后我想要一个单独的线程,它只是在设定的时间间隔内轮询该变量的值。因此,如果我理解正确,我应该能够直接从该可运行对象中访问该变量?
        • 在这种情况下我是否需要担心synchronizing,即UI线程何时写入变量,以及runnable何时读取变量?
        • 如果两者有可能同时更改值,您可能需要这样做,但我不确定在这种情况下您是否会遇到这种情况,但也许。
        【解决方案4】:

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

        • Activity.runOnUiThread(Runnable)

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

        • 在极少数情况下,在 UiThread 之外修改变量不会产生错误,在这种情况下,从 UiThread 访问它是安全的。在其他情况下,变量应该是私有的,并且尝试在 UiThread 之外访问它们应该引发IllegalStateException 或类似的东西。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-11-24
          • 1970-01-01
          • 2023-03-16
          • 1970-01-01
          • 2012-02-19
          • 1970-01-01
          • 2018-10-02
          相关资源
          最近更新 更多