我的观点:
- 减少样板代码从而带来
- 更少的耦合 - 更强的可读性
- 强大、易于实现自定义属性和自定义视图 - 比findViewById查询速度更快 (详情请见 这里)
他的观点:
- 自动生成的.class文件会增加应用程序大小。 - 调试困难
我进行了一些调查,但关于它没有太多的讨论。现在我想收集关于Android数据绑定的优缺点。
讨论方面包括但不限于:
- 单元测试 - 应用大小 - 性能 - 学习曲线 - 可读性 - 耦合性
xml
中,或需要额外的类。因此,您必须谨慎平衡使用数据绑定。findViewById
还要快 - 在这两个之间比较速度,在我看来没有意义,您永远不会注意到差异,如果您看到差异,则表示其中一个实现是错误的。annotations
库不太好。测试UI--使用数据绑定使UI的测试更加容易,但数据绑定并不足够,您还需要一个好的架构,并使用谷歌建议的架构来展示数据绑定的实际强大之处。
最明显的变化出现在我的原始回答的第2和第5点。在我们决定使用数据绑定后,代码阅读起来更加容易,这里最重要的一点是:我们作为团队决定使用数据绑定,之后,我们期望在XML文件中设置大部分琐碎和基本的UI布局。
关于调试部分,这里有一点棘手,Android Studio在数据绑定的错误和自动补全方面有很大的改进空间,但最常见的错误发生在前2-3次。此外,我学到了一个“干净项目”可以帮助解决很多问题。
作为原始帖子的第二个结论,如果您可以使用数据绑定,并且项目的截止日期/要求等允许,请尝试,这将是值得的(除非您做了一些非常愚蠢的事情:))。
我正在参与一个庞大的Android项目,团队决定逐步淘汰Data Binding库。为什么?主要原因是它会在构建过程中生成大量类,从而导致构建时间加长(超过10分钟)。
尽管我喜欢danypata的答案,但我想添加/编辑他的一些语句以适用于Android数据绑定。
1.移除样板代码 - 如danypata的答案所述,它会删除一些代码并将其添加到其他位置,比如布局中。这并不意味着模板代码没有减少,因为通常情况下是减少了的。
例如,您可能希望创建一个bindingadapter,用于处理Spinner/RecyclerView/ListView等的多个自定义ArrayAdapter,但仅需要一个简单的适配器。您可以通过使用以下内容在布局中使用适配器:
app:myCoolAdaptersData="@{model.mydata}"
现在,您可以创建通用适配器并在所有布局中重用bindingadapter,而无需例如使用:
ListView lv = findViewById(...);
CoolGenericAdapter<MyModel> coolAdapter = new CoolGenericAdapter<>(...);
lv.setAdapter(coolAdapter);
这只是一个简单的例子,将大型项目中的代码量大大减少。另一个减少代码量的示例是将模型绑定到布局。更新模型的字段值通常也会更新模型本身(如果至少是BaseObservable/ObservableField)。
这意味着您不需要找到所有视图、更新视图、更新模型等等。
2.更好的可读性 - 学习数据绑定所花费的额外时间并不重要。由于布局实际上没有什么不同,除了将它们包装在布局标记中并将命名空间放置在那里,因此它与“普通”布局并没有真正的区别。使用bindingadapters并在布局中访问模型可能需要一些时间,但通常您可以从基础知识开始,这些基础知识易于使用和美观。学习新东西总是需要时间的,但使用数据绑定一段时间后,您将轻松地超越这段时间。
3.强大 - 是的,它非常强大。它更容易重用现有的代码、重用现有的bindingadapters,并且可能导致更多生成的代码,但并非总是如此。例如,您可以在多个类中创建多个适配器,而不是创建一个bindingadapter,这可能很难以后“优化”。优化Bindingadapter意味着它将在所有地方得到更新。优化可以减少“代码行数”,因为无论如何都减少了锅炉板。
我同意第4点和第5点。
6.难于调试 由于AS 3.0+会输出有用的提示,例如您布局中的语法问题(行号和文件),因此很容易调试数据绑定生成的代码。如果您找不到问题,也可以检查生成的代码中是否有错误。某些库(如dagger 2或android架构库)可能会导致混淆,因为错误行与实际“错误”不匹配。这是由其他注解处理器生成的代码造成的。如果您知道这些注解处理器可能会与databindings错误输出产生冲突,那么您可以轻松修复。
7.单元测试 使用executePendingBindings就像不使用数据绑定一样。
8.可读性 没有使用数据绑定可能会更好阅读。由于您在布局中放置了一些业务逻辑,一些放在实际代码中,这可能会导致代码混乱。另一个问题是,在布局中使用lambda表达式可能会非常混乱,如果“布局设计师”不知道哪个参数可能会被使用。
另一个非常大的问题是bindingadapter可以出现在任何地方。使用BindingAdapter注释生成代码。这意味着在布局中使用它可能会导致找到适当的代码存在问题。如果要更新bindingadapter,您需要“找到”它。
何时应该使用什么? 对于较大的项目,将数据绑定与mvvm或mvp模式一起使用是一个非常好的主意。这是一个非常干净的解决方案,并且非常容易扩展。如果您只想创建一个小型简单的应用程序,而不使用数据绑定,则可以使用MVC模式。如果您有现有的通用bindingadapters可以从其他项目中使用,您可能希望使用数据绑定,因为这很容
数据绑定在概念上看起来很有前途,但我不喜欢它的实现部分。
我希望它能更简单、更直接一些。 因此,我感觉保持老派的方式会更加舒适。
模型类、可变对象、观察者对我来说都太多了,如果绑定使用的数据变量以可变和可观察的对象形式直接在类中接收,那么这将使过程更加清洁、简洁。