3

引用此处找到的 Android 开发人员指南它说

此外,Andoid UI 工具包不是线程安全的。因此,您不能从工作线程操作您的 UI——您必须从 UI 线程对您的用户界面进行所有操作

小部件不是线程安全的是什么意思?当我们从 UI 线程中更改按钮的名称时,是什么导致应用程序崩溃。我知道 UI 线程有一个事件队列,但是一个单独的线程如何导致这个队列出现问题?我试着环顾四周,到处都说你不能这样做,但没有理由吗?

4

1 回答 1

3

当文档说 UI 工具包不是线程安全的时,这意味着 UI 工具包的编写方式假定所有对 UI 对象的访问都是从单个线程进行的。通过这种假设,UI 工具包的实现者可以对所有 UI 对象进行非同步访问,而不必担心数据损坏。这使得 UI 工具包更易于实现、更易于测试,并提高了 UI 工具包的性能(因为它不需要在操作对象之前锁定对象)。

UI 工具包设计为仅在主线程(也称为“UI 线程”)上运行。如果您现在从另一个线程访问 UI 组件,您将面临损坏 UI 工具包对象的风险。为确保您不会这样做,UI 工具包设计人员会做两件事:

  • 他们在文档中写道,您不应该从主线程外部访问 UI 工具包
  • UI 工具包的一些(但不是全部)方法检查您是否从主线程外部进行访问并在这种情况下抛出异常

但是,这不会强制阻止您从另一个线程访问 UI 工具包。事实上,您可能可以从另一个线程更改按钮上的文本,而不会产生任何不良副作用。也就是说,你仍然不应该这样做。因为在某些情况下您会导致崩溃,在某些情况下您会发现您对 UI 所做的更改只是被覆盖或忽略等。

我希望这是有道理的。

于 2012-10-12T08:04:54.800 回答