前言: Android常用的架构有:MVC、MVP、MVVM,而MVVM是唯一一个官方提供支持组件的架构,我们可以通过Android lifecycle系列组件、DataBinding或者通过组合两者的形式来打造一个强大的MVVM架构。而DataBinding Compiler V2就是为了解决目前的MVVM架构中的缺点而诞生的。

Data Binding和LiveData的兼容问题

在DataBinding Compiler V1的环境下,DataBinding和LiveData是无法兼容的。这句话是什么意思呢?我们先来看看平时我们使用DataBinding的代码片段。

Data Binding
布局代码片段

<data>  <String>"/>  data>    <TextView  android:layoutwidth="matchparent"  android:layoutheight="40dp"  android:text=“@{text}“  />

注:xml不能直接使用‘<’所以我们需要使用转义符:"<"

使用代码片段

XXXBinding binding = ...  private final ObservableField<String> text = new ObservableField<>();  binding.setText(text)  text.set(" hello word ")

上面的代码片段是DataBinding的简单使用方法。

LiveData

我们知道LiveData是Google官方推出的生命周期感知的数据包装组件,用来搭建MVVM框架有天然的优势,能很好协调控制层与展示层生命周期不一致的问题(这里是指View层与ViewModel层)下面我们来看下使用LiveData更新UI的代码片段。

ViewModel代码片段
public class TestModel extends ViewModel {  private final MutableLiveData<String> text = new MutableLiveData<>();    public LiveData<String> getText() {  return text;  }  }  
View层代码片段
viewModel. getText().observe(this, observe -> {  tvText.setText(observe);  });  

当我们在ViewModel中调用 text.postValue(obj)方法时,UI层的observe方法就会收到回调,通过tvText.setText(observe);这句代码来更新tvText。

例如,我们可以在ViewModel中通过下面的代码来更新UI层

text.posValue("hello word !")  

可以看出,无论是使用DataBinding还是LiveData,都能实现View层和ViewModel层解耦的目的,并且能ViewModel层中的数据变化来实现View层的更新,这就是我们常说数据驱动视图。

数据驱动视图:只要数据变化, 就重新渲染视图
ObservableField与LiveData

我们知道DataBinding是通过ObservableField来实现数据的双向绑定的,而ObservableField本质上就是一个被观察者,而我们的xml布局文件和就是观察者,当ObservableField产生变化是会通知我们的布局文件更新布局(观察者模式)。
ObservableField如何实现通知布局文件更新的原理我们这里先不深入讨论,这里笔者只给出一个结论,ObservableField被View层(这里指我们的xml布局文件)以弱引用的方式引用,当ObservableField更新时,会通过监听器通知View层,并且ObservableField是对View层生命周期不敏感的。所以通过ObservableField实现数据双向绑定并不是一个完美的方案。

我们可以考虑使用LiveData来实现双向绑定。
我们先来回顾一下监听LiveData方法:

viewModel. getText().observe(this, observe -> {  tvText.setText(observe);  });  

非常简单,只在调用LiveData的observe,设置一个Observer
回调监听器就可以了。

那么上文提到的Databinding与LiveData不兼容是指什么呢?
从上面的分析我们可以看出ObservableField与LiveData的使用方式完全是完全不一样的,ObservableField可以通过直接在布局文件中设置实现双向绑定。而LiveData必须通过代码设置监听器,并且需要手动调用待更新的控件才能实现控件的更新。就是说LiveData只能通知UI层有数据需要更新,更新后的数据是什么,但是并不能自动帮你实现View的更新。并且当View层的数据更新后,LiveData也没办法自动获取View层的更新。

例如:在使用EditText的时候,要获取EditText的改变,需要调用EditText的getText方法,而ObservableField只需要调用get()方法即可

LiveData在Data Binding Compiler V1下是无法使用类似ObservableField的方式实现数据绑定的(单向也不行),这就是笔者所说的DataBinding与LiveData不兼容

当我们使用DataBinding与Lifecycle组合搭建MVVM框架的时候,需要根据业务的具体需要来选择使用LiveData还是ObservableField。类似下面的代码:

public final ObservableBoolean dataLoading = new ObservableBoolean(false);    private final MutableLiveData<Void> mTaskUpdated = new MutableLiveData <>();  

但是实际开发的时候,我们往往无法在ObservableField与LiveData中作出很好的选择,因为它们的优缺点都太明显了。
我们总结一下ObservableField与LiveData的优缺点。
ObservableField
优点:使用方便,能快速实现双向绑定
缺点:使用弱引用的方式与View层,并且不能根据View层的生命周期来发送通知

LiveData
优点:能根据View层的生命周期来发送通知事件
缺点:使用麻烦,与View层耦合大,并且不支持数据与View绑定

更多相关文章

  1. Android(安卓)开发:(八)数据适配器 Adapter 篇
  2. Android(安卓)Intent and Intent-filter SDK file
  3. The application has stopped unexpectedly
  4. Android_Servcie_后台服务总结笔记
  5. Android(安卓)NDK简介
  6. Android(安卓)实现程序完全退出
  7. 对Android(安卓)ListView的理解
  8. Android(安卓)String format
  9. 浅入浅出Android(017):当前Activity向下一个Activity切换,并传递数据

随机推荐

  1. 饭后Android 第一餐-NavigationView+Tool
  2. 【月入41万】Mono For Android中使用百度
  3. kotlin实现Android实现底部对话框BottomD
  4. Android用户界面 UI组件--ImageView及其
  5. Android + Eclipse + NDK + cygwin配制
  6. android 属性汇总
  7. Android(安卓)设置Dalog大小
  8. 在 android 上运行 python 的方法
  9. Android touch事件一种解释
  10. Android开发基础-系统结构