Android 开发者网站指出,在 UI 线程中工作时必须遵循两条规则,即
不要阻塞 UI 线程
不要从 UI 线程外部访问 Android UI 工具包*
这是否意味着我可以访问从工作线程(即不是 UI 工具包)中访问 UI 线程中的变量?
如果是这样,如果变量不断更新(例如,从SensorEventListener
. 谢谢。
Android 开发者网站指出,在 UI 线程中工作时必须遵循两条规则,即
不要阻塞 UI 线程
不要从 UI 线程外部访问 Android UI 工具包*
这是否意味着我可以访问从工作线程(即不是 UI 工具包)中访问 UI 线程中的变量?
如果是这样,如果变量不断更新(例如,从SensorEventListener
. 谢谢。
这是否意味着我可以从工作线程(即不是 UI 工具包)中访问 UI 线程中的变量?
是的,只要将它们声明为成员变量,您就可以访问它们。您甚至可以访问元素中的值,UI
例如getText()
在TextView
无法更新任何UI
元素的情况下使用。
如果变量不断更新,是否需要特别考虑,
如果它们正在更新,那么您可能希望有一种同步变量的方法。这样做的一个好方法是使用AsyncTask
并更新onPostExecute()
.
如果您不熟悉使用AsyncTask
,请确保您多次阅读文档并理解它们。
不,您不能在 UI 线程之外访问它们。很少有 UI 元素可以从非 UI 线程访问,其中一个是 ProgressBar。
您可以在单独的线程中访问 UI 元素,但不能更新它们
您可以在非 UI 线程中更新 UI 元素的唯一方法是使用runOnUiThread
或使用在单独线程中对 UI 线程进行回调,Handler
除此之外,您不能在单独线程中更改 UI 元素
不能在 UiThread 之外访问变量。如果您想从 UiThread 外部进行修改,请使用:
Activity.runOnUiThread(Runnable)
一些“发布”方法存储等待 UiThread 处理的修改。您可以使用BlockingQueue
例如。看看java.util.concurrent
包装
在极少数情况下,在 UiThread 之外修改变量不会产生错误,在这种情况下,从 UiThread 访问它是安全的。在其他情况下,变量应该是私有的,并且尝试在 UiThread 之外访问它们应该引发IllegalStateException
或类似的事情。