Android网络开发框架Retrofit(五:实战篇,实现MVP模式进行开发)
从前面几节的代码看来,似乎很不优雅,特别是
四:扩展篇,Retrofit+RxJava,加上RxJava后,代码看起来相当的难看,所以今天就说下如果使用MVP开发模式,将业务逻辑和界面分离,使我们的代码变得优雅好看起来
mvp,即是(model-处理业务逻辑(主要是数据读写,或者与后台通信(其实也是读写数据)),view-处理ui控件,presenter-主导器,操作model和view)
是从mvc模式演变过来的,在Android开发中,使用mvc模式,Activity变得不伦不类,不知道应该是v还是c了,为了解决这个问题,mvp出来了,将Activity划分成了view,在Activity中,我们只做更新界面的操作,其他的业务逻辑再也不放在Activity中了,这样可以更方便的管理我们的代码,利用这种开发模式还有一个很大的好处,就是团队开发项目起来快捷了很多,项目构建师将mvp中的p写好,将m和v分给团队成员,因为都是一个个接口,只要团队成员实现这些接口,这个项目就可以很快完成了,这样项目进度会大大的提高了很多,那么接下来,我们将mvp这种模式的实现展示一下
先建立好相对应的包名
比如我项目的包名是com.ysbing.retrofitdemo,在mvp中的目录下面会这样建立
注意我红框标注的地方,model和model下面的impl,presenter和presenter下面的impl,ui里面的activity,还有view
从目录结构可以看得出mvp的分工了,这样,分成几个模块后,写起来一开始会费点功夫,但这个模式搭建出来后,再去实现它,就会快很多了
1、Teach4Activity将presenter创建对象到Teach4Activity中,然后实现ITeach4View里面的接口方法
public class Teach4Activity extends Activity implements ITeach4View {
private Teach4Presenter presenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_teach4);
presenter = new Teach4PresenterImpl(this);
}
}
2、写Teach4PresenterImpl里的方法,将Activity里传过来的ITeach4View进行操作,并初始化Teach4Model
public class Teach4PresenterImpl implements Teach4Presenter {
private ITeach4View teach4View;
private Teach4Model teach4Model;
public Teach4PresenterImpl(ITeach4View teach4View) {
this.teach4View = teach4View;
teach4Model = new Teach4ModelImpl();
}
}
3、实现Teach4ModelImpl里的业务逻辑
public class Teach4ModelImpl implements Teach4Model {
@Override
public void queryIpInfo(final String ip, Subscriber<ApiBean<IpBean>> subscriber) {
}
}
4、将数据返回给Teach4PresenterImpl,然后更新ui
@Override
public void queryIpInfo(String ip) {
Subscriber<ApiBean<IpBean>> mySubscriber = new Subscriber<ApiBean<IpBean>>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
teach4View.showError(e);
}
@Override
public void onNext(ApiBean<IpBean> apiBean) {
teach4View.showIpInfo(apiBean.data);
}
};
teach4Model.queryIpInfo(ip, mySubscriber);
}
5、实现Activity中所有的接口方法,完成mvp模式的开发
@Override
public void showIpInfo(IpBean ipBean) {
String ipInfo = String.format("这里是用MVP模式结合RxJava获取的数据,IP是:%s,我在%s%s%s", ipBean.ip, ipBean.country, ipBean.region, ipBean.city);
mIpInfoText.setText(ipInfo);
}
@Override
public void showError(Throwable e) {
String err = "很遗憾失败了,错误是:" + e.toString();
mIpInfoText.setText(err);
}
本轮教程到此结束,Retrofit是个很优秀的网络框架,希望会越来越多人喜欢上并用它,接下来有时间我会对Retrofit的源码进行讲解,谢谢大家