关于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注册,以避免内存泄露。

代码

目录结构

如图,有个大致了解:



mvp:所有的mvp都放在这个包下

retrofit:Retrofit接口和配置文件

rxjava:RxJava一些回调设置

ui:Activity或fragment,建议按功能再细分包

核心代码

还是就贴出核心代码吧,源码在我的github上(https://github.com/WuXiaolong/AndroidMVPSample)。

MainActivity入口,还是演示的之前的MVP的天气的接口,接口请求方法放在Presenter。

MvpActivity

Presenter绑定Activity(Fragment)生命周期

  1. public abstract class MvpActivity<P extends BasePresenter> extends BaseActivity {
  2.     protected P mvpPresenter;
  3.     @Override
  4.     protected void onCreate(Bundle savedInstanceState) {
  5.         mvpPresenter = createPresenter();
  6.         super.onCreate(savedInstanceState);
  7.     }
  8.     protected abstract P createPresenter();
  9.     @Override
  10.     protected void onDestroy() {
  11.         super.onDestroy();
  12.         if (mvpPresenter != null) {
  13.             mvpPresenter.detachView();
  14.         }
  15.     }
  16. }

MainPresenter

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

  1. public class MainPresenter extends BasePresenter<MainView> {
  2.     public MainPresenter(MainView view) {
  3.         attachView(view);
  4.     }
  5.    
  6.     public void loadData(String cityId) {
  7.         mvpView.showLoading();
  8.         addSubscription(apiStores.loadData(cityId),
  9.                 new SubscriberCallBack<>(new ApiCallback<MainModel>() {
  10.                     @Override
  11.                     public void onSuccess(MainModel model) {
  12.                         mvpView.getDataSuccess(model);
  13.                     }
  14.                     @Override
  15.                     public void onFailure(int code, String msg) {
  16.                         mvpView.getDataFail(msg);
  17.                     }
  18.                     @Override
  19.                     public void onCompleted() {
  20.                         mvpView.hideLoading();
  21.                     }
  22.                 }));
  23.     }
  24. }

apiStores.loadData

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

  1. public interface ApiStores {
  2.     //baseUrl
  3.     String API_SERVER_URL = "http://www.weather.com.cn/";
  4.     //加载天气
  5.     @GET("adat/sk/{cityId}.html")
  6.     Observable<MainModel> loadData(@Path("cityId") String cityId);
  7. }

RxJava回调方法

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

  1. public class SubscriberCallBack<T> extends Subscriber<T> {
  2.     private ApiCallback<T> apiCallback;
  3.     public SubscriberCallBack(ApiCallback<T> apiCallback) {
  4.         this.apiCallback = apiCallback;
  5.     }
  6.     @Override
  7.     public void onCompleted() {
  8.         apiCallback.onCompleted();
  9.     }
  10.     @Override
  11.     public void onError(Throwable e) {
  12.         e.printStackTrace();
  13.         if (e instanceof HttpException) {
  14.             HttpException httpException = (HttpException) e;
  15.             //httpException.response().errorBody().string()
  16.             int code = httpException.code();
  17.             String msg = httpException.getMessage();
  18.             if (code == 504) {
  19.                 msg = "网络不给力";
  20.             }
  21.             apiCallback.onFailure(code, msg);
  22.         } else {
  23.             apiCallback.onFailure(0, e.getMessage());
  24.         }
  25.         apiCallback.onCompleted();
  26.     }
  27.     @Override
  28.     public void onNext(T t) {
  29.         apiCallback.onSuccess(t);
  30.     }
  31. }

BasePresenter

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

  1. public class BasePresenter<V> implements Presenter<V> {
  2.     public V mvpView;
  3.     public ApiStores apiStores = AppClient.retrofit().create(ApiStores.class);
  4.     private CompositeSubscription mCompositeSubscription;
  5.     @Override
  6.     public void attachView(V mvpView) {
  7.         this.mvpView = mvpView;
  8.     }
  9.     @Override
  10.     public void detachView() {
  11.         this.mvpView = null;
  12.         onUnsubscribe();
  13.     }
  14.     //RXjava取消注册,以避免内存泄露
  15.     public void onUnsubscribe() {
  16.         if (mCompositeSubscription != null && mCompositeSubscription.hasSubscriptions()) {
  17.             mCompositeSubscription.unsubscribe();
  18.         }
  19.     }
  20.     public void addSubscription(Observable observable, Subscriber subscriber) {
  21.         if (mCompositeSubscription == null) {
  22.             mCompositeSubscription = new CompositeSubscription();
  23.         }
  24.         mCompositeSubscription.add(observable
  25.                 .subscribeOn(Schedulers.io())
  26.                 .observeOn(AndroidSchedulers.mainThread())
  27.                 .subscribe(subscriber));
  28.     }
  29. }

源码地址

https://github.com/WuXiaolong/AndroidMVPSample

总结

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

微信公众号

欢迎微信扫一扫关注:不止于技术分享,每天进步一点点。

关于作者

点击查看

Android MVP+Retrofit+RxJava实践小结的更多相关文章

  1. 82.Android之MVP+Retrofit+RxJava实践小结

    转载:http://wuxiaolong.me/2016/06/12/mvpRetrofitRxjava/ 关于MVP.Retrofit.RxJava,之前已经分别做了分享,如果您还没有阅读过,可以猛 ...

  2. 设计模式笔记之四:MVP+Retrofit+RxJava组合使用

    本博客转自郭霖公众号:http://mp.weixin.qq.com/s?__biz=MzA5MzI3NjE2MA==&mid=2650236866&idx=1&sn=da66 ...

  3. Android MVP 利用rxjava 避免向Model传入监听方法

    传统的MVP: 1.抽离出View的接口,即ILoginView. 2.抽离Model的接口,即ILoginModel. 3.抽离Presenter的接口,即ILoginPresenter. 4.实现 ...

  4. mvp+retrofit+rxjava

    引用 "retrofit" : "com.squareup.retrofit2:retrofit:2.0.1", "retrofit-adapter& ...

  5. Android 基于Retrofit+Rxjava搭建的简单易用的网络架构

    装逼開始之前,为大家推荐两篇文章,用来更好的学习Retrofit和Rxjava. 在这里我们要感谢互联网装逼行业勇于献身,甘于奉献的的大婶们. 我仅代表个人,给您们跪舔了. Retrofit:Retr ...

  6. Android 基于ijkplayer+Rxjava+Rxandroid+Retrofit2.0+MVP+Material Design的android万能播放器aaa

    MDPlayer万能播放器 MDPlayer,基于ijkplayer+Rxjava+Rxandroid+Retrofit2.0+MVP+Material Design的android万能播放器,可以播 ...

  7. Android MVP开发模式及Retrofit + RxJava封装

    代码已上传到Github,因为接口都是模拟无法进行测试,明白大概的逻辑就行了! 欢迎浏览我的博客--https://pushy.site 1. MVP模式 1.1 介绍 如果熟悉MVP模式架构的话,对 ...

  8. Android实现文章+评论(MVP,RxJava,Dagger2,ButterKnife)

    简介 这个项目主要有两个功能,一个加载网页/文章,另一个用来显示评论.并应用了MVP模式,Dagger2.RxJava.ButterKnife等开源框架.效果图如下: 结构 首先来看一下布局文件: & ...

  9. 基于Retrofit+RxJava的Android分层网络请求框架

    目前已经有不少Android客户端在使用Retrofit+RxJava实现网络请求了,相比于xUtils,Volley等网络访问框架,其具有网络访问效率高(基于OkHttp).内存占用少.代码量小以及 ...

随机推荐

  1. CorelDRAW X8 如何破解激活(附国际版安装包+激活工具) 2016-12-15

    之前有位搞平面的好友“小瘦”说CDR X8无法破解,只能用X7.呃……呃……呃……好像是的 其实CDR8难激活主要在于一个点“没有离线激活了,只可以在线激活”,逆天不是专供逆向的,当然没能力去破解,这 ...

  2. html与html5

    HTML 是一种在 Web 上使用的通用标记语言.HTML 允许你格式化文本,添加图片,创建链接.输入表单.框架和表格等等,并可将之存为文本文件,浏览器即可读取和显示.HTML 的关键是标签,其作用是 ...

  3. Javascript实用方法

    这篇我主要记录一些在工作中常用的.实用的方法. String trim 字符串方法中的trim主要用来去空格使用,很多时候,在后台做参数处理的时候,我们都会使用该方法,比如在获取用户输入的账户时 va ...

  4. DataTable 转换成 Json的3种方法

    在web开发中,我们可能会有这样的需求,为了便于前台的JS的处理,我们需要将查询出的数据源格式比如:List<T>.DataTable转换为Json格式.特别在使用Extjs框架的时候,A ...

  5. C语言动态走迷宫

    曾经用C语言做过的动态走迷宫程序,先分享代码如下: 代码如下: //头文件 #include<stdio.h> #include<windows.h>//Sleep(500)函 ...

  6. Entity Framework 延伸系列目录

    1.采用MiniProfiler监控EF与.NET MVC项目 2.采用EntityFramework.Extended 对EF进行扩展 3.EntityFramework执行存储过程中遇到的那些坑 ...

  7. JAVA面试题

    在这里我将收录我面试过程中遇到的一些好玩的面试题目 第一个面试题:ABC问题,有三个线程,工作的内容分别是打印出"A""B""C",需要做的 ...

  8. org.jboss.deployment.DeploymentException: Trying to install an already registered mbean: jboss.jca:service=LocalTxCM,name=egmasDS

    17:34:37,235 INFO [Http11Protocol] Starting Coyote HTTP/1.1 on http-0.0.0.0-8080 17:34:37,281 INFO [ ...

  9. HTML5笔记2——HTML5音/视频标签详解

    音视频的发展史 早期:<embed>+<object>+文件 问题:不是所有浏览器都支持,而且embed不是标准. 现状:Realplay.window media.Quick ...

  10. Visual Studio 2013 添加一般应用程序(.ashx)文件到SharePoint项目

    默认,在用vs2013开发SharePoint项目时,vs没有提供一般应用程序(.ashx)的项目模板,本文解决此问题. 以管理员身份启动vs2013,创建一个"SharePoint 201 ...