基于livedata实现的mvvm_clean

本文介绍了MVVM模式,强调了其降低耦合度、提高扩展性和可读性的优点,以及可能导致ViewModel过于庞大、难以维护的缺点。为解决这一问题,作者推荐采用mvvm_clean架构,通过拆分ViewModel和引入Domain层来优化业务逻辑。详细步骤包括添加依赖、命名模式实现、页面交互与逻辑分离,并提供了相关Demo链接供参考。
摘要由CSDN通过智能技术生成

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

步骤

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<Q extends UseCase.RequestValues, P extends UseCase.ResponseValue> {
    public final static int CODE = -6;
    private Q mRequestValues;
    private UseCaseCallback<P> mUseCaseCallback;

    protected abstract void executeUseCase(Q value);

    public Q getRequestValues() {
        return this.mRequestValues;
    }

    public UseCaseCallback<P> getUseCaseCallback() {
        return this.mUseCaseCallback;
    }

    void run() {
        executeUseCase(this.mRequestValues);
    }

    public void setRequestValues(Q value) {
        this.mRequestValues = value;
    }

    public void setUseCaseCallback(UseCaseCallback<P> useCaseCallback) {
        this.mUseCaseCallback = useCaseCallback;
    }

    public interface RequestValues {
    }

    public interface ResponseValue {
    }

    public interface UseCaseCallback<R> {
        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<T extends BaseVm> 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(), 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值