(Base系列二)BaseMVPActivity BaseView BasePresenter封装

愉快的端午假期过去了,大家3天都是怎么过的呢?希望不是像我一样家里宅3天,惨~~~,今天记录一下我的Base系列之二,很简单的三个类,直接看代码

public abstract class BaseMVPActivity<P extends BasePresenter> extends BaseActivity implements BaseView {
    protected P mPresenter;
}

简单到爆,BaseMVPActivity直接继承自BaseActivity就好,只是多了一个属性,泛型的一个Presenter,同时实现了BaseView,先看下BaseView代码

public interface BaseView {
    void showLoadingDialog();
    void showLoadingDialog(String msg, boolean cancelable);
    void dismissLoadingDialog();
    void showErrorDialog();
    void showErrorDialog(String title, String subtitle, boolean cancelable, boolean isConnected);
    void dismissErrorDialog();
    void addDisposable(Disposable disposable);
    void addObserver(Observer observer);
}

BaseView代码也很简单,就是一些所有页面都需要的通用的方法,方法名和BaseActivity里的保持一致就好,这样就不需要显式的override了,直接在presenter里进行view.xxxx()就好了,最终调用的肯定是BaseActivity里的方法,再看一下BasePresenter的代码

public interface BasePresenter<K extends BasePresenter, T extends BaseView> {
    K attachView(T view);
}

就一个attchView方法,接受一个继承自BaseView的泛型T参数,返回一个继承自BasePresenter的K,其实实际中返回的就是实现类自己,下面大概看一个使用示例

public interface PadGoodsDetailContact {

    interface View extends BaseView {
        void onLoadGoodsDetailInfoSuccess(ProDetailInfo proDetailInfo);
        void onGoodsNoSold();
    }

    interface Presenter extends BasePresenter<PadGoodsDetailContact.Presenter, PadGoodsDetailContact.View> {
        void loadGoodsDetailInfo(int channelId);
    }
}

这是一个获取商品详情的模块的示例,Contact里包含了一个View和一个Presenter分别继承自BaseView,BasePresenter,定义具体方法和参数,接下来看实现View的部分

public class PadGoodsDetailActivity extends BaseMVPActivity<PadGoodsDetailContact.Presenter> implements PadGoodsDetailContact.View{

    ...

    @Override
    protected int getLayout() {
        这个方法返回的是BaseActivity里setContent里的布局,必须重写的方法
        return R.layout.activity_pad_goods_detail;
    }

    @Override
    protected void initData(Bundle savedInstanceState) {
        mPresenter = new PadGoodsDetailPresenter().attachView(this);
        ...
    }

    ...

    @Override
    public void onLoadGoodsDetailInfoSuccess(ProDetailInfo proDetailInfo) {
        ...
    }

    ...

    @Override
    public void onGoodsNoSold() {
        ...
    }
}

省略了很多具体代码,但是大体就是这样的,initData()上一篇说过,特意预留出来做初始化操作的,所以第一时间给mPresenter进行赋值,也就是attchView的返回值,再看PadGoodsDetailPresenter的具体代码

public class PadGoodsDetailPresenter implements PadGoodsDetailContact.Presenter {

    private PadGoodsDetailContact.View view;

    @Override
    public void loadGoodsDetailInfo(int channelId) {
        view.showLoadingDialog();
        view.dismissLoadingDialog();
        ...
        view.onLoadGoodsDetailInfoSuccess(xxx);
        view.onGoodsNoSold();
    }

    @Override
    public PadGoodsDetailContact.Presenter attachView(PadGoodsDetailContact.View view) {
        this.view = view;
        return this;
    }
}

同样的省略部分无关具体代码,但关键地方已经全部都有了,至此,一个完整的小MVP结构就都有了,总结一下,首先封装好BaseActivity,BaseMVPActivity,BaseView,BasePresenter,然后,写一个具体模块的Contact,包含一个VIew和一个Presenter,然后该模块的Activity继承自BaseMVPActivity并实现Contact.View,写一个该模块的Presenter,实现Contact.Presenter,该Presenter包含一个Contact.View的成员变量,在attchView的时候赋值该变量,同时返回该Presenter实例,也就是BaseMVPActivity里的mPresenter,大概流程就是这样,描述的不太清楚,但我相信结合上面代码示例是很容易明白的,OK,记录完成,庆祝自己在战胜懒癌的道路上又前进了一小步。下一篇,我打算再写一个BaseFragment,BaseMVPFragment,其实套路都一样,那么,下篇见,嘿。

猜你喜欢

转载自blog.csdn.net/dujianbo369/article/details/80730798