骚年都2020年了你还在用EventBus吗?jetpack之liveData

在说源码时简单说下liveData使用

//在app的build添加依赖

//使用liveData
implementation 'androidx.lifecycle:lifecycle-extensions:2.0.0'

 

1创建一个类实现ViewModel,定义一个方法获取liveData

/**
 * liveData是个抽象类 ,可以理解为一个能感知生命周期的仓库
 * mutableLIveData 是他的实现类
 */
public class MyViewModel extends ViewModel {
    //注意使用static修饰 源码直接通过类获取
    private static MutableLiveData> mutableLiveData;

    //获取仓库
    public MutableLiveData> getLiveData() {
        if (mutableLiveData == null) {
            mutableLiveData = new MutableLiveData<>();
        }
        return mutableLiveData;
    }

}

 

2定义一个bean类

public class Bean {
    String name;

    public Bean(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

 

3在activity中使用

订阅消息代码

  //调用系统API获取 viewModel
        MyViewModel myViewModel = ViewModelProviders.of(this).get(MyViewModel.class);
        liveData = myViewModel.getLiveData();
        //订阅消息
        liveData.observe(this, new Observer>() {
            @Override
            public void onChanged(List beans) {
                //数据接收
                Toast.makeText(LiveDataActivity.this, "" + beans.get(0).getName(), Toast.LENGTH_SHORT).show();
            }
        });

 

发送消息代码

 list.add(new Bean("张三"));
 list.add(new Bean("李四"));
liveData.setValue(list);

 

 

使用很简单,那我们分析下liveData是源码时如何实现的呢?

liveData这么好,那么我们看看他的源码的核心逻辑

我们从获取ViewModel代码入口  ViewModelProviders.of(this).get(MyViewModel.class);

点击of()方法,代码很简单,获取activity的application,创建ViewModelProviders对象

骚年都2020年了你还在用EventBus吗?jetpack之liveData_第1张图片

 

点击get()方法,把ViewModel的实现类和类全类名,传给内部get方法

骚年都2020年了你还在用EventBus吗?jetpack之liveData_第2张图片

 

点击内部的get方法,代码很简单,先从一个ViewModelStore获取ViewModel,如果有就直接返回,没有就创建,再保存到ViewmodelStore,再返回。

骚年都2020年了你还在用EventBus吗?jetpack之liveData_第3张图片

 

我们看看工厂的create()方法是如何创建ViewModel的,看到下图源码就一目了然,使用反射创建的

骚年都2020年了你还在用EventBus吗?jetpack之liveData_第4张图片

 

我们看看ViewModelStore代码,就是个HashMap保存的ViewModel封装类,源码看多,有很多类似的使用map复用的类似代码。

骚年都2020年了你还在用EventBus吗?jetpack之liveData_第5张图片

 

现在我们看看MutablLiveData的setValue()方法,点击进去,没有什么代码,那应该调用父类的setValue方法,

骚年都2020年了你还在用EventBus吗?jetpack之liveData_第6张图片

 

点击到父类的setValue方法,调用了dispatchValue方法

骚年都2020年了你还在用EventBus吗?jetpack之liveData_第7张图片

 

我们看看dispatchValue做了些什么,又调用了considerNotify()方法,在这个方法最后行代码,他实现了接口Observer的onChanged()方法

骚年都2020年了你还在用EventBus吗?jetpack之liveData_第8张图片

最终还是通过接口回调方式,把数据给到订阅者。

 

 

这是有人问,那liveData是如何感知感知什么周期的呢?我们点击liveData的obser方法,会发现是使用Lifecycle实现生命周期的监听。

骚年都2020年了你还在用EventBus吗?jetpack之liveData_第9张图片

 

如果对Lifecycle不了解的可以看我这篇文章https://blog.csdn.net/qq_36237165/article/details/102544785

 

liveData源码介绍到这,下面是我们基于liveData封装的一个库,可以实现一行代码发送消息,一行代码订阅消息,还能感知生命周期,从数据根源上防止内存泄漏。

https://blog.csdn.net/qq_36237165/article/details/104878044

喜欢的点星Thanks♪(・ω・)ノ

 

 

 

 

你可能感兴趣的:(工具,控件)