在说源码时简单说下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
//数据接收
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对象
点击get()方法,把ViewModel的实现类和类全类名,传给内部get方法
点击内部的get方法,代码很简单,先从一个ViewModelStore获取ViewModel,如果有就直接返回,没有就创建,再保存到ViewmodelStore,再返回。
我们看看工厂的create()方法是如何创建ViewModel的,看到下图源码就一目了然,使用反射创建的
我们看看ViewModelStore代码,就是个HashMap保存的ViewModel封装类,源码看多,有很多类似的使用map复用的类似代码。
现在我们看看MutablLiveData的setValue()方法,点击进去,没有什么代码,那应该调用父类的setValue方法,
点击到父类的setValue方法,调用了dispatchValue方法
我们看看dispatchValue做了些什么,又调用了considerNotify()方法,在这个方法最后行代码,他实现了接口Observer的onChanged()方法
最终还是通过接口回调方式,把数据给到订阅者。
这是有人问,那liveData是如何感知感知什么周期的呢?我们点击liveData的obser方法,会发现是使用Lifecycle实现生命周期的监听。
如果对Lifecycle不了解的可以看我这篇文章https://blog.csdn.net/qq_36237165/article/details/102544785
liveData源码介绍到这,下面是我们基于liveData封装的一个库,可以实现一行代码发送消息,一行代码订阅消息,还能感知生命周期,从数据根源上防止内存泄漏。
https://blog.csdn.net/qq_36237165/article/details/104878044
喜欢的点星Thanks♪(・ω・)ノ