简单的MVP写法(二)

来源:互联网 发布:acdsee软件 编辑:程序博客网 时间:2024/06/04 23:42

前面已经写了简单的MVP写法(一),现在介绍另外一种MVP的写法。
这种写法分为三层
Model :

public abstract class BaseModel {}

View :

public interface BaseView{    void onError(String e);    void setPresenter();    Activity getCurrentActivity();}

Presenter :

public interface BasePresenter  {    Context getContext();    void provideErrorMessage(String msg);}

当然了base中的方法完全可以由自己的业务需求来决定。

接下来举个例子:

Model的实现:

public class ExampleModel extends BaseModel {    private Context mContext;    private ExamplePresenter mPresenter;    public ExampleModel(ExamplePresenter mPresenter) {        this.mPresenter = mPresenter;        mContext = mPresenter.getContext();    }    public void getExampleDataFromServer(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) {                        mPresenter.provideExampleData(list);                    }                    @Override                    protected void _onError(Throwable e) {                        mPresenter.provideErrorMessage(e.toString());                    }                });    }}

ExampleModel负责向服务器发起网络请求,请求到数据之后,在回调方法中,由构造函数中传进来的Presenter负责传递数据。
再来看一下Presenter的接口和实现

public interface ExamplePresenter extends BasePresenter{    void getExampleData(String name,String longitude,String latitude,String sex);    void provideExampleData(List<NearbyPerson> list);}

接口有两个方法,一个方法负责请求数据,一个方法负责传递数据给view层
下面来看具体实现:

public class ExamplePresenterImpl implements ExamplePresenter {    private ExampleModel mExampleModel;    private ExampleView mExampleView;    public ExamplePresenterImpl(ExampleView mExampleView) {        this.mExampleView = mExampleView;        mExampleModel = new ExampleModel(this);    }    @Override    public Context getContext() {        return mExampleView.getCurrentActivity();    }    @Override    public void provideErrorMessage(String msg) {        mExampleView.onError(msg);    }    @Override    public void getExampleData(String name,String longitude,String latitude,String sex) {        //发起请求,实际上是让model去做        mExampleModel.getExampleDataFromServer(name,longitude,latitude,sex);    }    @Override    public void provideExampleData(List<NearbyPerson> list) {        //拿到数据之后,将数据给view        mExampleView.showExampleData(list);    }}

在需要数据地方,实现view层接口:

View接口:

public interface ExampleView extends BaseView{    void showExampleData(List<NearbyPerson> data);}

具体实现:

public class MainActivity extends AppCompatActivity implements ExampleView

复写方法:

 @Override    public void showExampleData(List<NearbyPerson> data) {        mShow.setText(data.toString());    }

最后还少的是一个开始,需要由presenter发起网络请求:
先初始化presenter:

mExamplePresenter = new ExamplePresenterImpl(this);

在需要发起请求的地方:

 mExamplePresenter.getExampleData("","","","");

最后完整的项目:
https://github.com/ckwcc/AnotherMVP

原创粉丝点击