Rxjava+retrofit+mvp整合
转载请标明出处:
http://blog.csdn.net/forezp/article/details/52621898
本文出自方志朋的博客
最近在看Rxjava,写了一个简单的 demo整合了Rxjava +retrofit+mvp,写完了迫不及待的分享出来了,打算以后的开发都用这个,太强大了,另外OKhTTP用了网络缓存,非常的方便,以后写缓存都不需要写本地数据库了。
这个项目使用到了拉姆达表达式: 
在安卓中使用Java 8 lambda表达式,很遗憾安卓原生不支持,需要用插件。 
 在工程中build.GRADLE导入:
  dependencies {
        classpath 'com.android.tools.build:gradle:2.1.0'
        classpath 'me.tatarka:gradle-retrolambda:3.2.5'
    }
在项目的build.gradle导入
  apply plugin: 'me.tatarka.retrolambda'
需要使用到Java8在android根下
  android {
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}
这样就可以在android下使用拉姆达表达式。
引入RXjAVA、RxAndroid、retrofit jar包
  compile 'io.reactivex:rxandroid:1.2.1'
    compile 'com.squareup.retrofit2:retrofit:2.1.0'
    compile 'com.squareup.retrofit2:converter-gson:2.1.0'
    compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'
关于retrofit的用法,点击见官网。
关于Rxjava的用法, 翻译的Rxjava中文文档
本文是一个整理好的RxJava+retrofit+Mvp的例子。
本文的的网络请求来源知乎API.
1.首先创建retrofit 接口
 public interface ZhihuApi {
    @GET("news/latest")
    Observable<NewsTimeLine> getLatestNews();
}
2.创建retrofit service
  File httpCacheDirectory = new File(MyApp.mContext.getCacheDir(), "responses");
        int cacheSize = 10 * 1024 * 1024; // 10 MiB
        Cache cache = new Cache(httpCacheDirectory, cacheSize);
        OkHttpClient client = new OkHttpClient.Builder()
                .addInterceptor(REWRITE_CACHE_CONTROL_INTERCEPTOR)
                .cache(cache).build();
        Retrofit retrofit_zhihu = new Retrofit.Builder()
                .baseUrl(ZHIHU_BASE_URL)
                .client(client)
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .build();
        ZhihuApiService = retrofit_zhihu.create(ZhihuApi.class);
配置json解析
   .addConverterFactory(GsonConverterFactory.create())
配置Rxjava 适配器
  .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
其中配置了网络缓存
   Interceptor REWRITE_CACHE_CONTROL_INTERCEPTOR = chain -> {
        CacheControl.Builder cacheBuilder = new CacheControl.Builder();
        cacheBuilder.maxAge(0, TimeUnit.SECONDS);
        cacheBuilder.maxStale(365, TimeUnit.DAYS);
        CacheControl cacheControl = cacheBuilder.build();
        Request request = chain.request();
        if (!NetUtils.isNetworkAvailable(MyApp.mContext)) {
            request = request.newBuilder()
                    .cacheControl(cacheControl)
                    .build();
        }
        Response originalResponse = chain.proceed(request);
        if (NetUtils.isNetworkAvailable(MyApp.mContext)) {
            int maxAge = 0; // read from cache
            return originalResponse.newBuilder()
                    .removeHeader("Pragma")
                    .header("Cache-Control", "public ,max-age=" + maxAge)
                    .build();
        } else {
            int maxStale = 60 * 60 * 24 * 28; // tolerate 4-weeks stale
            return originalResponse.newBuilder()
                    .removeHeader("Pragma")
                    .header("Cache-Control", "public, only-if-cached, max-stale=" + maxStale)
                    .build();
        }
    };
在MVP的P层进行网络请求,传统的应该是Model 层,写在P层少一次接口回调。
   public void getNews(IGetZhihuNewsView iGetZhihuNewsView){
        zhihuApi.getLatestNews( )
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(newsTimeLine -> {
                    disPlayZhihuList(iGetZhihuNewsView,newsTimeLine, context);
                },this::loadError);
    }
其中view接口
public interface IGetZhihuNewsView {
    void  getSuccess(NewsTimeLine newsTimeLine);
}
在Activity中
  public class MainActivity extends AppCompatActivity implements IGetZhihuNewsView {
    private TextView tv;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv= (TextView) findViewById(R.id.tv) ;
        ZhihuPresenter zhihuPresenter=new ZhihuPresenter(this);
        zhihuPresenter.getNews(this);
    }
   @Override
    public void getSuccess(NewsTimeLine newsTimeLine) {
        tv.setText(newsTimeLine.toString());
    }
}
代码比较简单,~~~
Rxjava+retrofit+mvp整合的更多相关文章
- 开发 Material Design+RxJava+Retrofit+MVP App 参考资料
		
前言 在开发一个基于 Material Design+RxJava+Retrofit+MVP 框架的 App 过程中学习的资料整理 —— 由G军仔分享 这里记录了我开发 大象 项目时,所学习的 ...
 - RxJava+Retrofit+MVP构建的App——聚合资讯
		
RtfRxMVP 聚合资讯APP,提供热点资讯,天气预报以及笑话精选服务,使用 Retrofit + RxJava + MVP 构建代码. Hello U 这是我的一个练习项目,第一次尝试运用 MVP ...
 - 高仿微信app (含有发红包,聊天,消息等)用到 Rxjava+Retrofit+MVP+Glide技术
		
https://github.com/GitLqr/LQRWeChat 技术很牛,可以看看
 - 使用mvp+rxjava+retrofit加载数据
		
将mvp和rxjava和retrofit简单整合的列子,让activity的代码不再那么臃肿,只负责显示数据. 关于mvp的介绍可以看这里, 关于Rxjava的介绍可以看这里; 关于retrofit的 ...
 - 手把手带你走进MVP +Dagger2 + DataBinding+ Rxjava+Retrofit 的世界
		
0.0 Android开发现在的变化用一个词来形容就是 :翻天覆地 越来越多的项目使用了MVP + Rxjava+Retrofit +Dagger2 + DataBinding等等东西.. 但是这些东 ...
 - Rxjava + retrofit + dagger2 + mvp搭建Android框架
		
最近出去面试,总会被问到我们项目现在采用的什么开发框架,不过据我的经验网络框架(volley)+图片缓存(uIl)+数据库(orm)+mvp,不过现在这套框架比较好了,现在采用什么呢?Rxjava + ...
 - android打飞机游戏、MVP句子迷App、悬浮窗、RxJava+Retrofit、加载动画、定制计划App等源码
		
Android精选源码 微信打飞机 android进度设置加载效果源码 Android新手引导库EasyGuide MVP-好看又好用的句子迷客户端 XFloatView 一个简易的悬浮窗实现方案 a ...
 - android完整资讯App、Kotlin新闻应用MVP + RxJava + Retrofit + Dagger2、优雅区间选择器等源码
		
Android精选源码 Android完整资讯客户端源码 android展示注册进度效果源码 Android Wifi热点数据传输Socket 通信示例源码 Android Dota的辅助信息app源 ...
 - android流式布局、待办事项应用、贝塞尔曲线、MVP+Rxjava+Retrofit、艺术图片应用等源码
		
Android精选源码 android模仿淘宝首页效果源码 一款艺术图片应用,采用T-MVVM打造 Android MVP + RxJava + Retrofit项目 android流式布局实现热门标 ...
 
随机推荐
- centOS和redHat防火墙开放端口
			
发现在CentOS 7上开放端口用iptables没效果(或者是sodino没找到正确的命令,传说Centos7 下默认的防火墙是 Firewall,替代了之前的 iptables)… 使用firew ...
 - [转]asp.net URL中包含中文参数造成乱码的解决方法
			
本文转自:http://www.jb51.net/article/22437.htm 问题: 前段时间,在系统中做了一个类似于友情链接的功能块,一直运行良好,直到有一天加了类似于以下的链接地址:htt ...
 - 小萝卜控机大师录制脚本(手机app自动化)
			
手机自动化测试 之前发布过小萝贝控机大师与按键精灵结合实现手机自动化测试的功能,小萝贝控机大师升级了实现了更多手机自动化测试的功能,如下: l 手机功能自动化测试:录制脚本,检查点时点击小萝贝控机大师 ...
 - Kudu和HBase定位的区别
			
不多说,直接上干货! Kudu和HBase定位的区别 Kudu 的定位是提供 “ast analytics on fast data” ,也就是在快速更新的数据上进行快速的查询.它定位 OLAP 和少 ...
 - Windows下Redis数据库管理工具(redis-desktop-manager)安装与配置(图文详解)
			
Redis Desktop Manager安装 Redis Desktop Manager直接下载安装就行非常简单.下载地址: 官网下载:https://redisdesktop.com/downlo ...
 - java内存区域与内存溢出
			
JVM的内存区域划分: jvm的内存区域分为5部分:程序计数器,虚拟机栈,本地方法栈,堆跟方法区. 程序计数器,虚拟机栈,本地方法栈三部分是线程私有的,堆跟方法区是公共的. 1.程序计数器 是一块较小 ...
 - ajax的serialize()方法
			
自己看吧,超级简单,就不用挨个获取表单名称和值对装在Json里往php传了,直接传个form就可以. [HTML] <form method="post" id=" ...
 - ANDROID_HOME is not set and "android" command not in your PATH解决
			
使用nodejs安装cordova后在项目里面添加平台时出现错误: 原因就是没有配环境变量 使用phonegap开发不仅要配JDK环境变量,还要配ADT环境变量,出现这个错误很显示就是没配ADT环境变 ...
 - Ajax   Jq    Razor语句
			
1.JS刷新当前页面: window.location.reload(); 2.JSon成功后转向其他页面: window.location.href="要转向页面的地址(一般格式:/页面所 ...
 - css颜色 hsla 和line-gradient
			
h 表示色调 从0-360 s 饱和度 0 - 100% l 亮度 0 -100% a 透明度 0-1