欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android MVP的基类抽取+二次封装

程序员文章站 2022-04-05 17:43:15
...

MVP 模式好不好,有的人说好,因为大家都说好,有的人说不好,代码太多。其实还是好的,不好是因为姿势不对。

MVP 全称:Model-View-Presenter ;MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方Controller/Presenter负责逻辑的处理,Model提供数据,View负责显示。

我们先过一张图来先理解
Android MVP的基类抽取+二次封装

mvp 主要目的在于代码解耦和方便单元测试

先带着看下基类,然后我们再看具体实现:
首先我们先看看 Fragment 的抽取

package com.qffxl.qffxl20190102.base;

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.fragment.app.Fragment;

import com.qffxl.qffxl20190102.base.mvp.BasePresenter;
import com.qffxl.qffxl20190102.base.mvp.IBaseView;

/**
 * @auther: 清风扶细柳
 * @Date: 2019/1/2
 * @Time:下午 07:01
 *    抽取的Fragmeng  
 */
public abstract class BaseFragment<P extends BasePresenter> extends Fragment implements IBaseView {
	
	
    protected P presenter;
	
	
    @Nullable
    @Override
    /*
    *创建布局
	*/
    
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = View.inflate(getActivity(), bindlayoutId(), null);
        presenter = initPresenter();
       
        presenter.attachView(this);
      
        initView(view);
        return view;


    }
	//交给子类   去实现方法
    protected abstract P initPresenter();

    protected abstract void initView(View view);

    protected abstract int layoutId();
	
	
    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        initData();
    }

    protected abstract void initData();
	
	//销毁的方法
    @Override
    public void onDestroy() {
        super.onDestroy();
		//解除绑定的 view 
        presenter.detachView();
    }

}

一、Presenter

package com.qffxl.qffxl20190102.base.mvp;

import java.lang.ref.WeakReference;

/**
 * @auther: 清风扶细柳
 * @Date: 2018/1/2
 * @Time:下午 07:18
 * 	 抽取的 Presenter基类    并且继承  抽取的 model基类   和  view  类
 */
public abstract class BasePresenter<M extends IBaseModel, V extends IBaseView> {
	
    protected M model;
    //通过弱引用来 初始化view
    private WeakReference<V> weakReference;

    public BasePresenter() {
        model = initModel();
    }

	//交给子类去  实现   必须是抽象的
    protected abstract M initsModel();

    //绑定view
    public void attachView(V v) {
        weakReference = new WeakReference<>(v);

    }

    //解绑view  的布局   
    public  void  detachView(){
    //进行判空处理
        if (weakReference != null) {
            weakReference.clear();
            weakReference = null;
        }
    }

    //得到弱引用对象
    public V getView(){
    //返回 得到的弱引用方法
        return weakReference.get();
    }


}

二、Contract

package com.qffxl.qffxl20190102.contract;

import com.qffxl.qffxl.base.mvp.IBaseModel;
import com.qffxl.qffxl.base.mvp.IBaseView;

/**
 * @auther:  清风扶细柳
 * @Date: 2019/1/2
 * @Time:下午 07:45
 *  契约接口类 用来统一管理接口
 */
public interface IShoeContract {

    interface IModel extends IBaseModel {
        void getData(String url,MCallBack mCallBack);
        void getDatas(String url,MCallBack mCallBack);
        interface ModelCallBack{
            void success(String string);
            void error(Throwable throwable);
        }
    }

    interface IView extends IBaseView {
        void success(String string);
        void error(Throwable throwable);
    }

    interface IPresenter {
        void getData(String url);
        void getDatas(String url);
    }


}

三、Presenter层

package com.qffxl.qffxl20190102.presenter;

import com.qffxl.qffxl20190102.base.mvp.BasePresenter;
import com.bwie.com.qffxl.qffxl20190102.contract.IShoeContract;
import com.bwie.com.qffxl.qffxl20190102.model.ShoeModel;

/**
 * @auther: 清风扶细柳
 * @Date: 2019/1/2
 * @Time:下午 07:55
 *  	数据对应的Presenter 层  出来处理逻辑 
 */
public class ShoePresnter extends BasePresenter<HomeModel, IHomeContract.IView> implements IHomeContract.IPresenter {
    @Override
    protected HomeModel initsModel() {
        return new ShoeModel();
    }

    @Override
    public void getData(String url) {
        model.getData(url, new IShoeContract.IModel.MCallBack() {
            @Override
            public void success(Object data) {
                getView().success(data);
            }

            @Override
            public void error(Throwable throwable) {
                getView().error(throwable);
            }
        });
    }

    @Override
    public void getDatas(String url) {
        model.getDatas(url, new IShoeContract.IModel.MCallBack() {
        	//请求数据成功的  方法
            @Override
            public void success(String string) {
                getView().success(string);
            }
			//请求数据失败的  方法
            @Override
            public void error(Throwable throwable) {
                getView().error(throwable);
            }
        });
    }
}

四、modle 层

package com.bwie.com.qffxl.qffxl20190102.model;

import android.util.Log;

import com.bwie.com.qffxl.qffxl20190102.base.mvp.IBaseModel;
import com.bwie.com.qffxl.qffxl20190102.contract.IHomeContract;
import com.bwie.com.qffxl.qffxl20190102.entity.FlowEntity;
import com.bwie.com.qffxl.qffxl20190102.model.entity.ProductEntity;
import com.bwie.com.qffxl.qffxl20190102.utils.VolleyUtil;
import com.google.gson.Gson;

/**
 * @auther: 清风扶细柳
 * @Date: 2019/1/2
 * @Time:下午 08:05
 *    model层   用来处理数据  请求网络
 */
public class ShoeModel  implements IHomeContract.IModel {
    @Override
    public void getData(String url, final MCallBack mCallBack) {

        Volley.getInstance().Get(url, new Volley.VCallBack() {
            @Override
            public void success(String response) {
            	//请求网络数据
                //成功的回调方法
            }

            @Override
            public void error(Throwable throwable) {
                  //错误的回调方法
            }
        });

    }

    @Override
    public void getDatas(String url, final MCallBack mCallBack) {
        Volley.getInstance().Get(url, new Volley.VCallBack() {
            @Override
            public void success(String response) {
             	//请求网络数据
                //成功的回调方法
            }

            @Override
            public void error(Throwable throwable) {
                //错误的回调方法
            }
        });
    }
}

相关标签: mvp