MVVM中基类抽取ViewModel的一点小实践经验
前提
之前写了一遍抽取BaseFragment的,链接:
抽取BaseFragment
ViewModel
viewmodel比较简单,主要是用来处理数据的,所以抽取基类比较简单,共性应该就是加载数据的过程,这个过程应该通知基类的Fragment,比如说loading时,就需要告诉fragment在loading,loaded也一样,于是:
public class BaseViewModel extends ViewModel {
private MutableLiveData<Integer> mViewStatus = new MutableLiveData<>();
//下面这些可以定义一个枚举类型,或者常量都可以
public void showLoading() {
mViewStatus.postValue("loading值");
}
public void showLoadSuccess() {
mViewStatus.postValue("LoadSuccess值");
}
public void showEmpty() {
mViewStatus.postValue("LoadEmpty值");
}
public void showLoadFailed() {
mViewStatus.postValue("LoadFailed值");
}
}
这个Livedata刚好在BaseFragment里面观察,然后去调具体的方法显示
引入lifecycle来无感化解决异步请求带来的OOM
在之前的那边文章中,创建ViewModel的时候将当前fragment的lifecycle给到ViewModel中,这样需要有一个来接收,于是:
public class BaseViewModel extends ViewModel {
private MutableLiveData mViewStatus = new MutableLiveData<>();
protected Lifecycle mLifecycle;
//这个需要导入rxjava的包
private CompositeDisposable mDisposables;
public void setLifecycle(Lifecycle lifecycle) {
this.mLifecycle = lifecycle;
}
//下面这些可以定义一个枚举类型,或者常量都可以
public void showLoading() {
mViewStatus.postValue("loading值");
}
public void showLoadSuccess() {
mViewStatus.postValue("LoadSuccess值");
}
public void showEmpty() {
mViewStatus.postValue("LoadEmpty值");
}
public void showLoadFailed() {
mViewStatus.postValue("LoadFailed值");
}
@Override
protected void onCleared() {
super.onCleared();
if (mDisposables != null) {
mDisposables.dispose();
mDisposables = null;
}
if (mLifecycle != null) {
mLifecycle = null;
}
super.onCleared();
}
/**
* 添加rx操作到容器中
* @param disposable
*/
public void addDisposable(Disposable disposable) {
if (mDisposables == null) {
mDisposables = new CompositeDisposable();
}
mDisposables.add(disposable);
}
}
很简单哦