简单的MVP写法(一)

来源:互联网 发布:musecc 2018mac破解版 编辑:程序博客网 时间:2024/06/03 06:22

目前接触过的项目,大部分都是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

原创粉丝点击