前面已经写了简单的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