框架组件(二)Data Binding 3-结合Observerable数据对象

该系列文章是对Android推出的架构组件相关文章,按作者自己理解来翻译的,同时标记有作者自己一些简单笔记。如果读者发现文中有翻译不准确的地方,或者理解错误的地方,请不吝指教。

源自Google官方
Data Binding Library 一文的翻译与归纳

其他相关链接:
Android Jetpack Components

[TOC]

可观测性是指一个对象能够在数据改变时通知其它对象。Data Binding 库允许你使用可观测的对象、字段或集合。

Data Binding库可以使用任何普通的对象,但是改变这些对象时不会自动触发UI更新。Data Binding 可以为你的数据对象提供数据改变时通知其他对象的能力,这里有三种不同的可观测类类型:对象、字段和集合。

当UI绑定了可观测数据对象并且数据对象的一个属性发生改变时,UI会自动刷新。

Observable fields(可观测字段)

要实现 Observable 接口会有一些工作量,如果你的类只有几个属性,那么这些工作是不值得的。基于这点,你可以使用通用的 Observable 类和以下特定的类让字段可观测。

  • ObservableBoolean
  • ObservableByte
  • ObservableChar
  • ObservableShort
  • ObservableInt
  • ObservableLong
  • ObservableFloat
  • ObservableDouble
  • ObservableParcelable

可观测字段是包含单个字段的可观测对象。原始版本在访问操作时避免装箱和拆箱操作。要使用此机制,需要在Java代码中创建公用的final属性,或在Kotlin中创建只读属性。如下代码所示:

private static class User {
    public final ObservableField firstName = new ObservableField<>();
    public final ObservableField lastName = new ObservableField<>();
    public final ObservableInt age = new ObservableInt();
}

使用 set()get() 方法访问字段的值,如下:

user.firstName.set("Google");
int age = user.age.get();

注意:Android Studio 3.1 或以上版本可以使用 LiveData 对象来替代可观测对象,这种做法更有益于你的应用。

Observable collections(可观测集合)

一些应用使用动态结构来保存数据,可观测集合可以使用 key 来访问这些结构。当 key 是引用类型时,比如 StringObservableArrayMap 类是很好的选择,如下所示:

ObservableArrayMap user = new ObservableArrayMap<>();
user.put("firstName", "Google");
user.put("lastName", "Inc.");
user.put("age", 17);

在布局中,可以通过 key 获取 map 中的值,如下:


    
    


当 key 是 int 类型时,可以选择 ObservableArrayList,如下:

ObservableArrayList user = new ObservableArrayList<>();
user.add("Google");
user.add("Inc.");
user.add(17);

再布局中可以通过下表来访问列表中的数据,如下:


    
    
    


Observable objects(可观测对象)

一个实现了 Observable 接口的类,允许注册监听可观测对象的数据改变。

Observable 接口有添加和移除监听的机制,但是你必须决定什么时候发送通知。为了让开发更容易,DataBinding 库提供了 BaseObservable 类,它已经实现了监听器注册机制。继承自 BaseObservable 的数据类主要负责属性改变时进行通知。为 getter 方法添加 @Bindable 并在 setter 中调用 ntifyPropertyChanged() 通知属性改变,如下所示:

private static class User extends BaseObservable {
    private String firstName;
    private String lastName;

    @Bindable
    public String getFirstName() {
        return this.firstName;
    }

    @Bindable
    public String getLastName() {
        return this.lastName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
        notifyPropertyChanged(BR.firstName);
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
        notifyPropertyChanged(BR.lastName);
    }
}

DataBinding 会为 module 中使用了数据绑定的 ID 和资源生成 BR 类。编译时在 BR 类中生成 Bindable 注解的条目。如果无法修改数据类的基类,可以使用 PropertyChangeRegistry 对象来实现 Observable 接口,以实现注册和通知监听器。

你可能感兴趣的:(框架组件(二)Data Binding 3-结合Observerable数据对象)