为什么必须在Android中的主线程上执行UI操作

时间:2015-09-07 11:04:51

标签: android

AFAIK,android使用单线程架构,其中调度所有UI组件事件,即。主线程或UI线程。 但是为什么我们不能在主线程以外的单独线程上执行UI操作?

2 个答案:

答案 0 :(得分:2)

首先,我需要说明这是一个设计级别的问题,已经被许多代程序员讨论过了:)

现在技术细节:

GUI框架是一件非常复杂的事情。 GUI框架需要显示(绘制)某些视图(或窗口)并将外部(主要是用户)输入路由到输入所针对的视图。现在,为了使用适当的事件调度到每个视图来管理具有视图的屏幕,所有视图都应该是图形的一部分,并且这种图形的最简单形式是树。因此,您基本上有一个要管理的视图树 - 其中信息应该被提供给根视图,从整个事件路由发生到子视图。

当然,一个专门的线程通过监视所有这些绘图和输入事件发布的消息队列来管理这个视图层次结构和事件路由 - 通过它自己或任何其他线程 - 是一个简洁而简单的解决方案。涉及多个线程的任何其他解决方案都会使已经很复杂的视图管理和事件路由代码容易出现死锁/活锁。

除了这些技术细节之外,您还需要记住,您正在尝试与一个框架开展业务,这个框架将被其他人使用,而这些人通常对您的架构的内部细节一无所知。 。在这样的框架中引入线程支持是对同步错误的公开邀请(阅读:死锁,脾气暴躁的最终用户,他们是程序员,最终是糟糕的业务)。

Android(以及99%其他GUI工具包)采用此方法。仅仅因为它使事情更简单,更不容易出错,有一个主线程来处理所有容易出错的处理。所有其他线程可以通过将消息发布到主线程的消息队列来自由地请求它执行操作。它是复杂性和稳定性之间的平衡。

这种方法的唯一缺点是视图的平滑更新 - 如果您有许多视图要同时更新,或者您的视图层次结构本身实际上是嵌套且复杂的。这种单线程架构的这种缺点在Android中表现得非常明显,如:

  1. 同时动画多个视图永远不会顺利 - 与iOS不同的是,他们已经尽力将此操作的某些部分移动到多个执行线程。

  2. Android文档需要一直提醒程序员不要在主线程中进行冗长的操作,以避免深层嵌套的视图层次结构。

答案 1 :(得分:1)

主要问题与背景有关。在后台线程中,您可以更新一些不在当前上下文中的UI内容。这是其中一个原因。

<强>更新

来自Android开发者指南:

  

此外,Andoid UI工具包不是线程安全的。所以,你必须   不要从工作线程操纵你的UI - 你必须做所有   从UI线程操作到您的用户界面。因此,那里   只是Android的单线程模型的两个规则:

Do not block the UI thread
Do not access the Android UI toolkit from outside the UI thread

您可以从[1] [2]了解有关线程安全的更多信息,您甚至可以通过一个小的exmaple和explenation来阅读[3]! 希望现在更加清楚地回答以前的简短快速回答:)