项目中MVVM简单搭建搭建

第一步:model层搭建:(用于数据的获取)

IModel接口

package com.wei.core.model;

/**
 * @author: wangluming
 * @date: On 2020/9/29
 */

public interface IModel {


}

IModel接口不需要实现任何方法

两个抽象类

RemotaModel(获取网络数据)

package com.wei.core.model;

/**
 * @author: wangluming
 * @date: On 2020/9/29
 */
public abstract class RomoteModel implements IModel {
    
}

LocalModel(获取本地数据:本地数据库,sp存储,本地文件)

package com.wei.core.model;

/**
 * @author: wangluming
 * @date: On 2020/9/29
 */
public abstract class LocalModel implements IModel {
}


第二步:Repository层搭建:(用于封装Model层)

package com.wei.core.repository;

import androidx.lifecycle.LifecycleOwner;

import com.wei.core.model.IModel;

/**
 * @author: wangluming
 * @date: On 2020/9/29
 */
public abstract class Repository<T extends IModel> {
    protected LifecycleOwner owner;
    private T mModel;



    public Repository(LifecycleOwner _owner) {
        owner = _owner;
        mModel = createModel();
    }

    protected abstract T createModel();

    public T getmModel() {
        return mModel;
    }
}

抽象类Repository泛型继承自IModel接口里面可以传入IModel接口的两个实现类RemotaModel LocalModel

第三步:viewModel层搭建:(业务逻辑实现)

package com.wei.core.viewmodel;

import androidx.lifecycle.LifecycleObserver;
import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.ViewModel;

import com.wei.core.repository.Repository;

import java.util.HashMap;
import java.util.Map;

/**
 * @author: wangluming
 * @date: On 2020/9/29
 */
public class BaseViewModel extends ViewModel implements LifecycleObserver {
    protected LifecycleOwner owner;

    protected Map<String, Repository> repositoryMap;

    public BaseViewModel(LifecycleOwner _owner) {
        owner = _owner;
        repositoryMap = new HashMap<>();
    }

    protected void registerRepository(String key,Repository repository){
        if (repositoryMap.containsKey(key)){
            return;
        }
        repositoryMap.put(key,repository);
    }
    protected void unRegisterRepository(String key){
        if (repositoryMap.containsKey(key)){
            repositoryMap.remove(key);
        }

    }
    protected <SubRepository extends Repository> SubRepository getRepository(String key,Repository repository){
        if (repositoryMap.containsKey(key)){
            return (SubRepository) repositoryMap.get(key);
        }
        return null;
    }
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    public void disConnectOwner(){
        if (repositoryMap!=null){
            repositoryMap.clear();
            repositoryMap = null;
        }
    }



}

获取不同数据仓库的对象并从中获取数据,继承ViewModel 以及 实现LifecycleObserver接口(viewModel层与view层生命周期同步,避免造成内存泄漏)用一个Map集合来存放不同类型的数据仓库,用时直接从集合中取出相应的数据。

第四步:View层搭建:(用于数据的展示)

BaseActivity

package com.wei.core.view;

import android.os.Bundle;
import android.widget.Toast;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.databinding.DataBindingUtil;
import androidx.databinding.ViewDataBinding;

import com.wei.core.viewmodel.BaseViewModel;

/**
 * @author: wangluming
 * @date: On 2020/9/29
 */
public abstract class BaseActivity<Binding extends ViewDataBinding,VM extends BaseViewModel> extends AppCompatActivity {
    protected Binding binding;
    protected VM vm;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = DataBindingUtil.setContentView(this, getLayout());
        vm = createVM();
        initBinding();
        initData(savedInstanceState);
        initEvent();
    }

    protected abstract VM createVM();

    protected abstract void initEvent();

    protected abstract void initData(Bundle savedInstanceState);

    protected abstract void initBinding();

    protected abstract int getLayout();

    protected void showMsg(String msg){
        Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
    }
}

BaseFragment

package com.wei.core.view;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.databinding.DataBindingUtil;
import androidx.databinding.ViewDataBinding;
import androidx.fragment.app.Fragment;

import com.wei.core.viewmodel.BaseViewModel;

/**
 * @author: wangluming
 * @date: On 2020/9/29
 */
public abstract class BaseFragment<Binding extends ViewDataBinding, VM extends BaseViewModel> extends Fragment {
    protected Binding binding;
    protected VM vm;

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

        binding = DataBindingUtil.inflate(inflater, getLayout(), container, false);
        View root = binding.getRoot();
        vm = createVM();
        initBinding();
        return root;

    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        initData();
        initEvent();


    }

    protected abstract void initEvent();

    protected abstract void initData();

    protected abstract void initBinding();

    protected abstract VM createVM();

    protected abstract int getLayout();
}


版权声明:本文为m0_46322939原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。