基于livedata实现的mvvm_clean

一、mvvm是什么

引用度娘:MVVM是Model-View-ViewModel的简写。它本质上就是MVC 的改进版。MVVM 就是将其中的View 的状态和行为抽象化,让我们将视图 UI 和业务逻辑分开。当然这些事 ViewModel 已经帮我们做了,它可以取出 Model 的数据同时帮忙处理 View 中由于需要展示内容而涉及的业务逻辑

m(Model):数据源,主要包括网络数据源和本地缓存数据源。

V(View):视图,主要是activity和Fragment,承担UI渲染和响应用户操作

VM(ViewModel):Model和View通信的桥梁,承担业务逻辑功能。

二、mvvm的优缺点

优点

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的负担。

推荐方案:mvvm_clean

参考:mvp_clean

实现:继续拆分viewModel层,分为viewModel和domain层

domain层:一个个独立的“任务”,主要使用命令模式把请求,返回结果封装了。这个任务可以到处使用,也实现责任链模式将复杂得业务简单化。井井有条。

步骤

基于livedata实现的mvvm_clean_第1张图片

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(), 

你可能感兴趣的:(Android开发)