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

为什么在Android中必须在主线程上执行UI操作,android,Android,另外,android使用单线程架构,其中所有UI组件事件都被调度,即主线程或UI线程。 但是为什么我们不能在主线程以外的单独线程上执行UI操作呢?主要问题与上下文有关。在后台线程中,您可以更新一些不在当前上下文中的UI内容。这是原因之一 更新: 从Android开发者指南: 此外,andoidui工具包不是线程安全的。所以,你必须 不要从工作线程操作UI,您必须完成所有操作 从UI线程对用户界面进行操作。因此, Android的单线程模型有两条规则: Do not block the UI th

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

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

更新:

从Android开发者指南:

此外,andoidui工具包不是线程安全的。所以,你必须 不要从工作线程操作UI,您必须完成所有操作 从UI线程对用户界面进行操作。因此, Android的单线程模型有两条规则:

Do not block the UI thread
Do not access the Android UI toolkit from outside the UI thread
您可以从中阅读更多关于线程安全的内容,甚至可以阅读一些小的exmaple和解释!
希望现在对之前简短而快速的回答更清楚一些:)

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

现在技术细节:

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

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

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

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

这种方法的唯一缺点是视图的平滑更新—如果您有多个视图要同时更新,或者视图层次结构本身是嵌套的和复杂的。这种单线程架构的缺点在Android中以非常明显的形式表现出来,比如:

  • 同时设置多个视图的动画从来都不是平滑的-不像iOS那样,iOS会费力地将此操作的某些部分移动到多个执行线程

  • Android文档需要时刻提醒程序员不要在主线程中执行冗长的操作,并避免深入嵌套的视图层次结构


  • 我在找一些技术上的解释。