愉快的端午假期过去了,大家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,其实套路都一样,那么,下篇见,嘿。