本来一直使用mvc的,也使用了一段时间的mvp,因为接手的项目不大,基本上用mvc就成,但是后面接手的别人的项目,用的mvc,发现整个项目面目全非,有种无从下手的感觉,遂决定抛弃mvc,全都改用mvp,至少给继任者一点小小的帮助!
1.首先是一个公用的OnHttpCallBack接口
public interface OnRequestCallback<T> {
void onSuccessful(T t);
void onFaild(String e);
}
很简单的代码,随自己的实际需求修改。
2.然后是一个Contract类
public class TestContract {
/**
* M逻辑(业务)处理层
*/
interface ITestModel {
void getTestData(String params, OnRequestCallback<TestBean> callBack);//获取数据接口
}
/**
* P视图与逻辑处理的连接层
*/
interface ITestPresenter {
void getTestData(String params);//获取数据方法
}
/**
* V视图层
*/
interface ITestView {
void showToast(String info);
}
}
这个中转类是给接口用的,自己查找起来方便一点,就是这样,单纯的懒。接口就这个三个,接口里面的方法随开发的实际需求自行定义。
3.然后就是实现接口了
首先是model
public class TestModel implements TestContract.ITestModel {
@Override
public void getTestData(String params, final OnRequestCallback<TestBean> callBack) {
TestAPI.requestData(params)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<TestBean>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
if (e instanceof HttpException) {
HttpException httpException = (HttpException) e;
if (httpException.code() == 500 || httpException.code() == 404) {
callBack.onFaild("服务器出错");
}
} else if (e instanceof ConnectException) {
callBack.onFaild("网络断开,请打开网络!");
} else if (e instanceof SocketTimeoutException) {
callBack.onFaild("网络连接超时!!");
} else {
callBack.onFaild("发生未知错误" + e.getMessage());
}
}
@Override
public void onNext(TestBean response) {
callBack.onSuccessful(response);
}
});
}
}
然后是Presenter
public class TestPresenter implements TestContract.ITestPresenter {
private TestContract.ITestModel model;
private TestContract.ITestView view;
private Context context;
public TestPresenter(TestContract.ITestView view, Context context) {
this.view = view;
this.context = context;
model = new TestModel();
}
@Override
public void getTestData(String params) {
model.getTestData(params, new OnRequestCallback<TestBean>() {
@Override
public void onSuccessful(TestBean bean) {
view.showToast(bean.toString());
}
@Override
public void onFaild(String errorMsg) {
view.showToast(errorMsg);
}
});
}
}
最后是view
public class TestActivity extends AppCompatActivity implements TestContract.ITestView{
private TestPresenter presenter;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_test);
presenter = new TestPresenter(this,this);
presenter.getTestData("test");
}
@Override
public void showToast(String info) {
Toast.makeText(this,info,Toast.LENGTH_LONG).show();
}
}
简易后的代码大概是这个样子,很多地方都可以重新优化,有错误请各位大佬指正,不胜感激!至于那个网络请求,我用的是retrofit+rxjava,网络请求这一块可以暂时省略,直接延用原项目的,就这样。。。