JoJo的个人博客

记录精彩的程序人生

目录
JetPack系列之LiveData
/    

JetPack系列之LiveData

概述

LiveData 是一种可观察的数据存储器类,具有生命周期感知能力,意指它遵循其他应用组件(如 ActivityFragmentService)的生命周期。

通常会与 ViewModelDataBinding结合,实现 MVVM的模式。

我使用并封装了JetPack系列组件的用法,java版参考代码JetPackDemo

优势

使用 LiveData 具有以下优势:

  • 确保界面符合数据状态

    LiveData 遵循观察者模式。当生命周期状态发生变化时, LiveData 会通知 Observer 对象。您可以整合代码以在这些 Observer 对象中更新界面。观察者可以在每次发生更改时更新界面,而不是在每次应用数据发生更改时更新界面。

  • 不会发生内存泄漏

    观察者会绑定到 Lifecycle 对象,并在其关联的生命周期遭到销毁后进行自我清理。

  • 不会因 Activity 停止而导致崩溃

    如果观察者的生命周期处于非活跃状态(如返回栈中的 Activity),则它不会接收任何 LiveData 事件。

  • 不再需要手动处理生命周期

    界面组件只是观察相关数据,不会停止或恢复观察。 LiveData 将自动管理所有这些操作,因为它在观察时可以感知相关的生命周期状态变化。

  • 数据始终保持最新状态

    如果生命周期变为非活跃状态,它会在再次变为活跃状态时接收最新的数据。例如,曾经在后台的 Activity 会在返回前台后立即接收最新的数据。

  • 适当的配置更改

    如果由于配置更改(如设备旋转)而重新创建了 ActivityFragment,它会立即接收最新的可用数据。

  • 共享资源

    您可以使用单一实例模式扩展 LiveData 对象以封装系统服务,以便在应用中共享它们。LiveData 对象连接到系统服务一次,然后需要相应资源的任何观察者只需观察 LiveData 对象。如需了解详情,请参阅扩展 LiveData

创建和使用

//ViewModel中创建 aa为默认值,也可以不设置
MutableLiveData<String> email = new MutableLiveData<>("aa");

//ui层进行观察
mViewModel.email.observe(this, new Observer<String>() {
    @Override
    public void onChanged(String s) {

    }
});

//更新
email.setValue("bb")

转换LiveData

Transformations.map()

对存储在 LiveData 对象中的值应用函数,并将结果传播到下游。

LiveData<User> userLiveData = ...;
LiveData<String> userName = Transformations.map(userLiveData, user -> {
    user.name + " " + user.lastName
});

Transformations.switchMap()

对存储在 LiveData 对象中的值应用函数,并将结果解封和分派到下游。传递给 switchMap() 的函数必须返回 LiveData 对象.

private LiveData<User> getUser(String id) {
  ...;
}

LiveData<String> userId = ...;
LiveData<User> user = Transformations.switchMap(userId, id -> getUser(id) );

合并多个 LiveData 源

MediatorLiveDataLiveData的子类,可以合并多个 LiveData 源。只要任何原始的 LiveData 源对象发生更改,就会触发 MediatorLiveData 对象的观察者。

示例代码

MediatorLiveData<Boolean> enableLogin = new MediatorLiveData<>();
Observer<String> observer;

public HomeViewModel() {
    observer = s -> {
        if (TextUtils.isEmpty(email.getValue()) || TextUtils.isEmpty(password.getValue())) {
            enableLogin.postValue(false);
        } else {
            enableLogin.postValue(true);
        }
    };
    enableLogin.addSource(email, observer);
    enableLogin.addSource(password, observer);
}

参考文章

Android开发者文档-LiveData


标题:JetPack系列之LiveData
作者:SunnySky
地址:https://www.tianyang.pub/articles/2020/07/03/1593772725042.html

评论