Android开发者网站指出,在UI线程中工作时必须遵循两条规则,即
不要阻止UI线程
不要从UI线程外部访问Android UI工具包*
这是否意味着我可以从工作线程中访问UI线程中的变量,即不是UI工具包?
如果是这样,如果变量不断更新(例如,来自SensorEventListener
),则需要给出任何特殊注意事项。感谢。
答案 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
或类似的事情。