源码地址
[https://github.com/WuXiaolong/AndroidMVPSample]
关于MVP、Retrofit、RxJava,之前已经分别做了分享,如果您还没有阅读过,可以猛戳:
1、Android MVP 实例
2、Android Retrofit 2.0使用
3、RxJava
4、RxBus
假设,您对MVP、Retrofit、RxJava已经有了一点了解,那么我们开始本文:
Android MVP优化
1、MVP绑定Activity(Fragment)生命周期按照之前的文章,每个Presenter都得初始化和销毁,我新加MvpActivity(MvpFragment),加了抽象方法protected abstract P createPresenter();
这样做的目的在需要使用MVP的地方,可以继承MvpActivity(MvpFragment),然后初始化和销毁就不用手动一个个去加了。
2、接口请求等还是放到MVP的P中

这个图片,在当时写MVP文章时给出的,实际开发中,我发现每个都这样写,实在是增加了不少代码,然接口请求放到P中,还有个好处,就是MVP绑定Activity(Fragment)生命周期,当onDestroy时取消RXJava注册,以避免内存泄露。
代码
目录结构
如图,有个大致了解:

Paste_Image.png

mvp:所有的mvp都放在这个包下retrofit:Retrofit接口和配置文件rxjava:RxJava一些回调设置ui:Activity或fragment,建议按功能再细分包
核心代码
还是就贴出核心代码吧,源码在我的github上(https://github.com/WuXiaolong/AndroidMVPSample)。
MainActivity入口,还是演示的之前的MVP的天气的接口,接口请求方法放在Presenter。
MvpActivity
Presenter绑定Activity(Fragment)生命周期

public abstract class MvpActivity

extends BaseActivity { protected P mvpPresenter; @Override protected void onCreate(Bundle savedInstanceState) { mvpPresenter = createPresenter(); super.onCreate(savedInstanceState); } protected abstract P createPresenter(); @Override protected void onDestroy() { super.onDestroy(); if (mvpPresenter != null) { mvpPresenter.detachView(); } }}

MainPresenter

apiStores.loadData方法是Retrofit做的网络请求,回调是RxJava完成的。

public class MainPresenter extends BasePresenter { public MainPresenter(MainView view) { attachView(view); }  public void loadData(String cityId) { mvpView.showLoading(); addSubscription(apiStores.loadData(cityId), new SubscriberCallBack<>(new ApiCallback() { @Override public void onSuccess(MainModel model) { mvpView.getDataSuccess(model); } @Override public void onFailure(int code, String msg) { mvpView.getDataFail(msg); } @Override public void onCompleted() { mvpView.hideLoading(); } })); }}

apiStores.loadData

是不是很简单,关于Retrofit配置,详见源码AppClient。

public interface ApiStores { //baseUrl String API_SERVER_URL = "http://www.weather.com.cn/"; //加载天气 @GET("adat/sk/{cityId}.html") Observable loadData(@Path("cityId") String cityId);}

RxJava回调方法

这里onError,写了如果网络请求用httpcode来判断。当然可以不要。\

 private ApiCallback apiCallback; public SubscriberCallBack(ApiCallback apiCallback) { this.apiCallback = apiCallback; } @Override public void onCompleted() { apiCallback.onCompleted(); } @Override public void onError(Throwable e) { e.printStackTrace(); if (e instanceof HttpException) { HttpException httpException = (HttpException) e; //httpException.response().errorBody().string() int code = httpException.code(); String msg = httpException.getMessage(); if (code == 504) { msg = "网络不给力"; } apiCallback.onFailure(code, msg); } else { apiCallback.onFailure(0, e.getMessage()); } apiCallback.onCompleted(); } @Override public void onNext(T t) { apiCallback.onSuccess(t); }}

BasePresenter

再来看看BasePresenter,这里做了Presenter初始化和销毁(包括RXjava取消注册),调用在MvpActivity。

public class BasePresenter implements Presenter { public V mvpView; public ApiStores apiStores = AppClient.retrofit().create(ApiStores.class); private CompositeSubscription mCompositeSubscription; @Override public void attachView(V mvpView) { this.mvpView = mvpView; } @Override public void detachView() { this.mvpView = null; onUnsubscribe(); } //RXjava取消注册,以避免内存泄露 public void onUnsubscribe() { if (mCompositeSubscription != null && mCompositeSubscription.hasSubscriptions()) { mCompositeSubscription.unsubscribe(); } } public void addSubscription(Observable observable, Subscriber subscriber) { if (mCompositeSubscription == null) { mCompositeSubscription = new CompositeSubscription(); } mCompositeSubscription.add(observable .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(subscriber)); }}

总结
三者结合使用,重点还是对MVP的优化,Retrofit只贴出最简单的(后续会写Retrofit详情使用),Rxjava可能我是对它认识尚浅,实际运用最多还是RxBus。

更多相关文章

  1. 网络请求工具类WebServiceUtils
  2. Android中MVP模式的内存泄漏解决及Retrofit2、RxJava中断网络请
  3. Android之使用Http协议实现文件上传功能
  4. Android的NestedScroll机制
  5. OKHttp原理解析
  6. Android——使用网络技术之使用OkHttp
  7. Android(安卓)OKhttp请求遇到的问题
  8. Android(安卓)Retrofit Put请求
  9. Android(安卓)Listener侦听的N种写法

随机推荐

  1. Android(安卓)Studio 创建第一个项目应用
  2. Android(安卓)JNI 使用的数据结构JNINati
  3. Android属性动画ValueAnimator源码简单分
  4. Android之SQlite数据库
  5. Android(安卓)Nine Patch图片及按钮背景
  6. android shelves
  7. 首届 Google 暑期大学生博客分享大赛——
  8. Android(安卓)surfaceflinger学习笔记之f
  9. Android学习之二:使用Android文档帮助
  10. 【Android】“存储”之普通文件存储(内部