Jetpack源码 之 LiveData

0. 前言

LiveData是Jetpack中一个响应式开发框架,官方文档对它的说明是一种可观察的数据存储器类,具有生命周期感知能力。有点类似于感知生命周期的RxJava。

0.1 用法

通常LiveData都是结合着ViewModel使用的,一般都是在ViewModel中创建LiveData:

class MvvmViewModel : ViewModel() {
   

    // 通过MutableLiveData创建一个可读可写的LiveData
    // 设置为Private,避免外部对数据直接进行修改,并暴露对外接口,让外部通过接口来修改
    private val _count = MutableLiveData(0)
    // 暴露给外部一个只读的LiveData副本,让外部监听数据通过此LiveData监听
    val count: LiveData<Int>
        get() = _count

    fun increaseCount() {
   
        _count.value = _count.value?.plus(1)
    }

    fun clearCount() {
   
        _count.value = 0
    }
}

0.2 源码

LiveData源码其实挺简单的,但是在看他的源码之前得先了解Lifecycle的源码,因为LiveData其实是大量通过Lifecycle实现的。

1. MutableLiveData

这个类是我们用来可读可写的LiveData,我们对值的修改都是通过这个类的,那我们来看下他的源码:

public class MutableLiveData<T> extends LiveData<T> {
   

    public MutableLiveData(T value) {
   
        super(value);
    }
c MutableLiveData() {
   
        super();
    }

    @Override
    public void postValue(T value) {
   
        super.postValue(value);
    }

    @Override
    public void setValue(T value) {
   
        super.setValue(value);
    }
}

源码就这么点,全是调用父类的方法,而他的父类就是LiveData类。
那么既然这些方法都是调用的LiveData的,那么为什么我们不直接使用LiveData而要去使用MutableLiveData呢?

当你看到LiveData源码时就能知道,LiveData虽然有这些方法,但是他是一个抽象类,没办法直接构造对象,所以我们就需要通过MutableLiveData来操作。

2. LiveData

2.1 基本属性

public abstract class LiveData<T> {
   
    // 数据锁,通过Synchronized线程同步
    @SuppressWarnings("WeakerAccess") /* synthetic access */
    final Object mDataLock = new Object();
    // LiveData的初始化版本
    // 如果构造方法中没有给值,那么 mVersion 直接使用此值
    // 如果给值,那么 mVersion=START_VERSION+1
    // 见下面构造方法
    static final int START_VERSION = -1;
    // mData的默认值
    // 如果构造方法传值,那么mData使用传入的值
    // 如果没有,则使用此值
    // 见下面构造方法
    @SuppressWarnings("WeakerAccess") /* synthetic access */
    static final Object NOT_SET = new Object();

    // 一个SafeIterableMap,用来保存监听的对象,key是观察者对象,value是观察者和mActive、mVersion构成的一个对象
    // SafeIterableMap是一个可以安全递归的HashMap
    private SafeIterableMap<Observer<? super T>, ObserverWrapper> mObservers =
            new SafeIterableMap<>();

    // 活跃的Obsever的数量
    @SuppressWarnings("WeakerAccess") /* synthetic access */
    int mActiveCount = 0;
    // 当前LiveData的数据
    private volatile Obj
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值