Android MVP的基类抽取+二次封装
程序员文章站
2022-04-05 17:43:15
...
MVP 模式好不好,有的人说好,因为大家都说好,有的人说不好,代码太多。其实还是好的,不好是因为姿势不对。
MVP 全称:Model-View-Presenter ;MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方Controller/Presenter负责逻辑的处理,Model提供数据,View负责显示。
我们先过一张图来先理解
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) {
//错误的回调方法
}
});
}
}
上一篇: JUnit_Test入門教程
下一篇: MVP模式解析