美文网首页框架
MVP 终极抽取(下)

MVP 终极抽取(下)

作者: 夜沐下的星雨 | 来源:发表于2020-08-05 08:03 被阅读0次

流程图:

mvp终极.jpg

通过MVP终极抽取(上)让我们可以知道Model 的抽取。那么开始view ,presenter 的抽取 并且写了只要fragment 继承Smart 传入一个泛型参数<> 这个参数个数不定。 就可以进行网络获取 并且代码更简洁,更方便。

分包

base.PNG

创建IBaseVIew:

//在VIew 创建P 层
public interface IBaseView <P extends IBasePresenter>{
    P createPresenter();
}

创建IBasePresenter:

//extends  最少也要继承一个IBaseView   supper  上线
public interface IBasePresenter<V extends IBaseView> {
   //绑定VIew
   void bindView(V view);

   //解绑VIew
   void unBindView();

   void cancelRequest();
}

创建BasePresenter:

public abstract class BasePresenter<V extends IBaseView> implements IBasePresenter<V> {
    protected V mView;
    @Override
    public void bindView(V view) {
        this.mView=view;
    }

    @Override
    public void unBindView() {
        this.mView=null;
    }
}

创建BaseMVPFragment:

//创建MVPFragment 方法
public abstract   class BaseMVPFragment<P extends IBasePresenter> extends BaseFragment implements IBaseView<P> ,BaseView {
    //声明P层
    protected P presenter;
    private MvpLoadingView mLoadView;
    //创建onCreate 方法  进行绑定
    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        presenter = createPresenter();
        presenter.bindView(this);
    }

    //创建解绑
    @Override
    public void onDestroyView() {
        super.onDestroyView();
        presenter.unBindView();
    }
}

传入一个参数 (以泛型的形式)也就是bean类 进行一次网络数据的请求

创建IBaseSmartView1:

public interface IBaseSmartView1<D,P extends IBaseSmartPresenter1> extends IBaseView<P> {
 //接受P层数据
    void onResult1(MvpResponse<D> response);
}

创建IBaseSmartPresenter1:

public interface IBaseSmartPresenter1<D,V extends IBaseSmartView1<D,?>> extends IBasePresenter<V>{
//设置数据类型
    void setType(Class<D> type);
 //做请求方法
    void doRequest(MvpRequest<D> request);
}

创建BaseSmartPresenter1:


public class BaseSmartPresenter1<D,V extends IBaseSmartView1<D,?>> extends BasePresenter<V> implements IBaseSmartPresenter1<D,V> {

 //定义model 对象
    protected IBaseModel model;
    //创建切断
    protected CompositeDisposable compositeDisposable;
    //得到Type 实体类
    protected Class<D> mType;
    //得到model对象
    public BaseSmartPresenter1(){
        model=new BaseRepository();
    }
    //获取具体对象
    @Override
    public void setType(Class<D> type) {
    mType=type;
    }
    //得到model层数据方法
    @Override
    public void doRequest(MvpRequest<D> request) {
        //得到实体类
        request.setType(mType);
        model.doRequest(request, new IBaseCallBack<D>() {
            @Override
            public void onStart(Disposable disposable) {
                handStart(disposable);
            }

            @Override
            public void onResult(MvpResponse<D> response) {
                if(mView != null){
                    mView.onResult1(response);
                }
            }
        });
    }
  //切断网络数据
    @Override
    public void cancelRequest() {
        if (compositeDisposable!=null){
            compositeDisposable.dispose();
        }
    }
//添加
    protected void handStart(Disposable d){
        if (compositeDisposable==null){
            compositeDisposable=new CompositeDisposable();
        }
        compositeDisposable.add(d);
    }
}

创建BaseSmartFragment1:


public abstract class BaseSmartFragment1<D> extends BaseMVPFragment<BaseSmartPresenter1<D,?>> implements IBaseSmartView1<D, BaseSmartPresenter1<D,?>> {


    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
//获取bean类
        ParameterizedType superClass = (ParameterizedType) getClass().getGenericSuperclass();
        Class<D> aClass = (Class<D>) superClass.getActualTypeArguments()[0];
        presenter.setType(aClass);

    }

    public void doRequest(MvpRequest<D> request) {
        presenter.doRequest(request);
    }

    @Override
    public BaseSmartPresenter1<D,?> createPresenter() {
        return new BaseSmartPresenter1<>();
    }

}

传入两个参数(以泛型的形式) 两个bean 可以进行两次不同类型网络数据的请求

创建IBaseSmartView2:

public interface IBaseSmartView2<D1,D2,P extends IBaseSmartPresenter2<D1,D2,?>> extends IBaseSmartView1<D1,P> {
    void onResult2(MvpResponse<D2> response);
}

创建IBaseSmartPresenter2:

public interface IBaseSmartPresenter2<D1,D2,V extends IBaseSmartView2<D1,D2,?>> extends IBaseSmartPresenter1<D1,V> {
    void setType2(Class<D2> type);
    void doRequest2(MvpRequest<D2> request);

}

创建BaseSmartPresenter2:

public class BaseSmartPresenter2 <D1,D2,V extends IBaseSmartView2<D1,D2,?>> extends BaseSmartPresenter1<D1,V>
            implements IBaseSmartPresenter2<D1,D2,V> {

    protected Class<D2> mType2;
    @Override
    public void setType2(Class<D2> type) {
        mType2 = type;
    }

    @Override
    public void doRequest2(MvpRequest<D2> request) {
        mMode.doRequest(request, new IBaseCallBack<D2>() {
            @Override
            public void onStart(Disposable disposable) {
               handStart(disposable);
            }
            @Override
            public void onResult(MvpResponse<D2> response) {
                if(mView != null){
                    mView.onResult2(response);
                }
            }
        });
    }

}

创建BaseSmartFragment2:

public abstract class BaseSmartFragment2<D1,D2> extends BaseMVPFragment<BaseSmartPresenter2<D1,D2,?>> implements IBaseSmartView2<D1,D2, BaseSmartPresenter2<D1,D2,?>>{


    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ParameterizedType superClass = (ParameterizedType) getClass().getGenericSuperclass();

        Class<D1> aClass = (Class<D1>) superClass.getActualTypeArguments()[0];
        Class<D2> aClass2 = (Class<D2>) superClass.getActualTypeArguments()[1];

        presenter.setType(aClass);
        presenter.setType2(aClass2);
    }

    protected void doRequest1(MvpRequest<D1> request){
        presenter.doRequest(request);
    }

    protected void doRequest2(MvpRequest<D2> request){
        presenter.doRequest2(request);
    }

    @Override
    public BaseSmartPresenter2<D1, D2, ?> createPresenter() {
        return new BaseSmartPresenter2<>();
    }
}

传入三个参数(以泛型的形式) 三个bean 可以进行两次不同类型网络数据的请求

创建IBaseSmartView3:

public interface IBaseSmartView3<D1,D2,D3,P extends IBaseSmartPresenter3<D1,D2,D3,?>> extends IBaseSmartView2<D1,D2,P> {
    void onResult3(MvpResponse<D3> response);
}

创建IBaseSmartPresenter3:


public interface IBaseSmartPresenter3<D1,D2,D3,V extends IBaseSmartView3<D1,D2,D3,?>> extends IBaseSmartPresenter2<D1,D2,V> {
    void setType3(Class<D3> type);
    void doRequest3(MvpRequest<D3> request);

}

创建BaseSmartPresenter3:

public class BaseSmartPresenter3<D1,D2,D3,V extends IBaseSmartView3<D1,D2,D3,?>>
        extends BaseSmartPresenter2<D1,D2,V>
        implements IBaseSmartPresenter3<D1,D2,D3,V> {

    protected Class<D3> mType3;
    @Override
    public void setType3(Class<D3> type) {
        mType3 = type;
    }

    @Override
    public void doRequest3(MvpRequest<D3> request) {
        mMode.doRequest(request, new IBaseCallBack<D3>() {
            @Override
            public void onStart(Disposable disposable) {
                handStart(disposable);
            }

            @Override
            public void onResult(MvpResponse<D3> response) {
                if(mView != null){
                    mView.onResult3(response);
                }
            }
        });
    }
}

创建BaseSmartFragment3:

public abstract class BaseSmartFragment3<D1,D2,D3> extends BaseMVPFragment<BaseSmartPresenter3<D1,D2,D3,?>> implements IBaseSmartView3<D1,D2,D3, BaseSmartPresenter3<D1,D2,D3,?>>{


    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ParameterizedType superClass = (ParameterizedType) getClass().getGenericSuperclass();

        Class<D1> aClass = (Class<D1>) superClass.getActualTypeArguments()[0];
        Class<D2> aClass2 = (Class<D2>) superClass.getActualTypeArguments()[1];
        Class<D3> aClass3 = (Class<D3>) superClass.getActualTypeArguments()[2];

        presenter.setType(aClass);
        presenter.setType2(aClass2);
        presenter.setType3(aClass3);
    }

    protected void doRequest1(MvpRequest<D1> request){
        presenter.doRequest(request);
    }

    protected void doRequest2(MvpRequest<D2> request){
        presenter.doRequest2(request);
    }

    protected void doRequest3(MvpRequest<D3> request){
        presenter.doRequest3(request);
    }

    @Override
    public BaseSmartPresenter3<D1, D2,D3, ?> createPresenter() {
        return new BaseSmartPresenter3<>();
    }
}

Smart 的使用:

public class RegisterFragment extends BaseSmartFragment1<ColumnData> {

    private TextView text;

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        GetRequest getRequest = new GetRequest("/api/column/columnmanagelist");
        HashMap<String, Object> commonParams = ParamsUtils.getCommonParams();
        getRequest.setParams(commonParams);
        doRequest(getRequest);
    }

    @Override
    protected void initView() {
        text = findViewById(R.id.text_c);
    }

    @Override
    protected int getLayout() {
        return R.layout.layout_fragment2;
    }

    @Override
    public void onResult1(MvpResponse<ColumnData> response) {
        ColumnData data = response.getData();
        ColumnData.ColumnInfo list = data.getList();
        ArrayList<ColumnData.Column> myColumn = list.getMyColumn();
        String name = myColumn.get(0).getName();

        Log.d("EEEEEEEEE","eeeeeeeeeee"+data.toString()+name);
        text.setText(name);
    }

    @Override
    public IBasePresenter getPresenter() {
        return presenter;
    }
}

相关文章

  • MVP 终极抽取(下)

    流程图: 通过MVP终极抽取(上)让我们可以知道Model 的抽取。那么开始view ,presenter 的抽取...

  • MVP终极抽取(上)

    流程图: 首先创建model 层 并且对他的请求参数,网络请求,数据参数,进行封装,这样可以减小相似代码。更简洁。...

  • MVP抽取

    为什么要抽取? 每一个页面都用到同样的内容,每次都写同样的代码,浪费;规定代码的编写规范;多人开发维护变得简单。 ...

  • Mvp抽取

    为什么要抽取? 每一个页面都用到同样的内容,每次都写同样的代码,浪费;规定代码的编写规范;多人开发维护变得简单。 ...

  • MVP抽取

    描述: 当我们的逻辑功能越来越多,每个功能点都要写一套MVP,是一件很繁琐的事情。因此我们要对MVP的进行封装和抽...

  • MVP抽取

    为什么要抽取? 每一个页面都用到同样的内容,每次都写同样的代码,浪费; 规定代码的编写规范; 多人开发维护变得简单...

  • MVP抽取

    一、抽取原因 每一个页面都用到同样的内容,每次都写同样的代码,浪费;规定代码的编写规范;多人开发维护变得简单。 二...

  • 自制MVP基类框架依赖库和工具类(自用)

    抽取 除了mvp层的抽取,还有对Activity、Adapter、Fragment的抽取 工具类 验证码工具类:C...

  • MVP抽取.md

    让子类的工作模式都按父类的执行 一个抽象类公开定义了执行它的方法的方式 网络抽取 HttpManager RxUt...

  • Mvp_抽取

    1.BaseActivity层 2.BaseCallBack层(与BaseView层相同) 3.Baseview层...

网友评论

    本文标题:MVP 终极抽取(下)

    本文链接:https://www.haomeiwen.com/subject/nqbqrktx.html