引用度娘:MVVM是Model-View-ViewModel的简写。它本质上就是MVC 的改进版。MVVM 就是将其中的View 的状态和行为抽象化,让我们将视图 UI 和业务逻辑分开。当然这些事 ViewModel 已经帮我们做了,它可以取出 Model 的数据同时帮忙处理 View 中由于需要展示内容而涉及的业务逻辑
m(Model):数据源,主要包括网络数据源和本地缓存数据源。
V(View):视图,主要是activity和Fragment,承担UI渲染和响应用户操作
VM(ViewModel):Model和View通信的桥梁,承担业务逻辑功能。
1、在mvp模式中,View层和present层会互相依赖,耦合度很高,很容易出现内存泄漏,为了解决内存问题,需要注意回收内存,到处判空。mvvm中view单向依赖viewModel,降低了耦合度
2、livedata会随着页面的生命周期变化自动注销观察者,极大避免了页面结束导致的crash
3、极大的提高了扩展性和降低了维护难度
4、在规范的mvvm中,view层没有任何除view外的成员变量,更没有if,for,埋点等业务逻辑,代码非常简洁,可读性很高,很容易找到业务入口。
在规范的mvvm中,viewMode承担了太多业务,会导致viewModel,达到几千行甚至上万行。难以阅读,难以扩展,难以维护。
1、多个viewModel
根据业务逻辑,拆分ViewModel为多个,但是会导致层次混乱,1对1变成1对多。
2、其他helper,util分担业务逻辑,减少viewmodel的负担。
参考:mvp_clean
实现:继续拆分viewModel层,分为viewModel和domain层
domain层:一个个独立的“任务”,主要使用命令模式把请求,返回结果封装了。这个任务可以到处使用,也实现责任链模式将复杂得业务简单化。井井有条。
1、在app中的build.gradle
添加ViewModel和LiveData依赖
implementation "android.arch.lifecycle:extensions:1.1.1"
annotationProcessor "android.arch.lifecycle:compiler:1.1.1"
支持lambda表达式(lambda非常简单易用,可以简化代码,自行搜索)
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
2、命名模式实现
public abstract class UseCase {
public final static int CODE = -6;
private Q mRequestValues;
private UseCaseCallback mUseCaseCallback;
protected abstract void executeUseCase(Q value);
public Q getRequestValues() {
return this.mRequestValues;
}
public UseCaseCallback
getUseCaseCallback() {
return this.mUseCaseCallback;
}
void run() {
executeUseCase(this.mRequestValues);
}
public void setRequestValues(Q value) {
this.mRequestValues = value;
}
public void setUseCaseCallback(UseCaseCallback
useCaseCallback) {
this.mUseCaseCallback = useCaseCallback;
}
public interface RequestValues {
}
public interface ResponseValue {
}
public interface UseCaseCallback {
void onError(Integer code);
void onSuccess(R result);
}
}
关键就是这个类,本人改进了mvp_clean中不支持错误码的缺点,可以返回各种情况。
详细参考链接:
https://github.com/googlesamples/android-architecture/tree/todo-mvp-clean
2、view中:
package com.gbq.myproject.base;
import android.arch.lifecycle.Lifecycle;
import android.arch.lifecycle.ViewModelProviders;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import com.gbq.myproject.util.LogUtil;
import java.lang.reflect.ParameterizedType;
public abstract class BaseVMActivity extends AppCompatActivity {
protected T mViewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
LogUtil.i(getClass().getSimpleName(), "onCreate");
super.onCreate(savedInstanceState);
setContentView(getContentId());
initVm();
initView();
initData();
}
@Override
protected void onStart() {
super.onStart();
LogUtil.d(getClass().getSimpleName(), "onStart");
}
@Override
protected void onResume() {
super.onResume();
LogUtil.d(getClass().getSimpleName(), "onResume");
}
@Override
protected void onPause() {
super.onPause();
LogUtil.d(getClass().getSimpleName(), "onPause");
}
@Override
protected void onStop() {
super.onStop();
LogUtil.d(getClass().getSimpleName(),