【发布时间】:2018-09-13 23:48:34
【问题描述】:
我在我的应用程序中使用了工作线程,因此了解哪些代码可以从工作线程运行以及哪些代码需要在 UI 线程上运行对我来说至关重要。
在 Android 文档中,可以找到以下提示:
因此,您不得从工作线程操作您的 UI — 您必须这样做 从 UI 线程对用户界面的所有操作。 [...] 但是,请注意,您不能从任何线程更新 UI,除了 UI 线程或“主”线程。
(source)
但“操作用户界面”在实践中的含义通常并不像看起来那么清楚。当然,很明显,您不能从工作线程中隐藏视图、操作按钮文本、添加列表视图条目等。
但是,例如,从工作线程调用setRequestedOrientation() 怎么样?这是允许的还是它属于 UI 操作,因此必须从 UI 线程调用?有什么方法可以告诉我或者我应该保持安全并在有疑问时更好地在 UI 线程上运行代码?
【问题讨论】:
-
"有什么办法可以告诉"——如果你从后台线程调用它并且你崩溃了一个异常,表明你不能从后台线程调用它,那么你需要使用 main应用程序线程。在某些情况下,您可能会在编译时收到有关该问题的 Lint 警告/错误。
-
setRequestedOrientation()在后台线程中工作正常。那么这是否意味着它可以从后台线程调用它,或者它只是纯粹的运气,下次它可能会崩溃? -
AFAIK,行为应该是一致的。如果框架不抱怨你使用的线程,那么框架的工作就是确保线程安全。但是,结果可能会因操作系统版本或制造商的调整而异。如果您真的厌恶风险,请在主应用程序线程上进行工作。
标签: android multithreading android-activity