目前接触过的项目,大部分都是MVP模式,现在使用MVP模式比较习惯。
关于MVP的概念:
M-Model-模型、V-View-视图、C-Controller-控制器,MVP作为MVC的演化版本,那么类似的MVP所对应的意义:M-Model-模型、V-View-视图、P-Presenter-表示器。 个人认为,MVP与MVC最不同的一点是M与V是不直接关联的也是就Model与View不存在直接关系,这两者之间间隔着的是Presenter层,其负责调控 View与Model之间的间接交互。本质就是降低了程序的耦合性。MVP三个层各自负责相应的任务就好了,Model层负责获取数据,通过Presenter层将数据传递给View层(一般是实现了特定View接口的Activity和Fragment)。
对于MVP模式的具体实现,有这很多的理解,下面简单的介绍一种,这种写法和谷歌官方给出的demo类似,个人感觉是简化了Model层,首先是写一个Contract接口:
public interface SearchBookContract {
interface SearchBookView extends BaseView{
void showNearbyListResult(List<NearbyPerson> list);
}
interface SearchBookPresenter extends BasePresenter{
void getSearchBooks(String name,String longitude,String latitude,String sex);
}
}
这个接口里面有两个接口,分别代表View和Presenter,BaseView和BasePresenter可以由各自项目的需求具体再写。
接下来是Presenter的具体实现:
public class SearchBookPresenterImpl implements SearchBookContract.SearchBookPresenter {
private SearchBookContract.SearchBookView mSearchBookView;
private Context mContext;
public SearchBookPresenterImpl(SearchBookContract.SearchBookView mSearchBookView) {
this.mSearchBookView = mSearchBookView;
}
@Override
public void getSearchBooks(String name,String longitude,String latitude,String sex) {
AppNetLoader.getInstance().async(AppNetLoader.getInstance().getService().getNearbyPersonList(name, longitude, latitude, sex),
new BaseObserver<List<NearbyPerson>>() {
@Override
protected void setNeedContext() {
setContext(mContext);
}
@Override
protected void _onNext(List<NearbyPerson> list) {
mSearchBookView.showNearbyListResult(list);
}
@Override
protected void _onError(Throwable e) {
mSearchBookView.onError(e.toString());
}
});
}
@Override
public void getContext(Context context) {
mContext = context;
}
}
实现SearchBookPresenter 的方法,在getSearchBooks方法中发起网络请求,获取数据,再通过Rxjava的转换,在回调方法中,mSearchBookView获得了数据。
在需要数据的Activity或者Fragment中,实现SearchBookContract.SearchBookView,实现其方法之后,就可以拿到数据啦。
需要注意的是,需要在Activity或者Fragment中先初始化对应的Presenter,
private SearchBookPresenterImpl mPresenter;
然后在onceate方法中
mPresenter = new SearchBookPresenterImpl(this);
接着在需要发起网络请求的地方发起请求就好了:
mPresenter.getSearchBooks("","","",'");
最后在其回调中回去请求成功或者失败的数据:
这是请求成功的方法
@Override
public void showNearbyListResult(List<NearbyPerson> list) {
mShow.setText(list.toString());
}
这是请求失败的方法
@Override
public void onError(String e) {
mShow.setText(e);
}
最后,具体的代码(包括Retrofit+Rxjava的封装,网络请求封装)都在我的github中:
https://github.com/ckwcc/MVP-Retrofit-RxJava