
Android开发之Rxjava+Retrofit
了解并使用RxJava和Retrofit来开发Android项目,能够拥有自己的项目框架。
RxJava和Retrofit结合使用最基本的格式:用 subscribeOn()和observeOn()来控制线程,并通过 subscribe()来触发网络请求的开始。
一叶飘舟
目标赋予我们生命的意义和目的。有了目标,我们才会把注意力集中在追求喜悦,而不是在避免痛苦上。(急需找我,加微信:jdsjlzx)
展开
-
基于Retrofit+Okio+RxBus实现文件下载(带下载进度)
一、前言 Retrofit是一个非常优秀、非常流行的简化HTTP请求的库,有个小的不足是下载文件时,没有提供显示文件下载进度的回调,这在下载文件时无疑会影响用户体验,本文基于Retrofit+Okio+RxBus实现了带下载进度的文件下载功能。二、效果三、实现过程3.1 下载文件的代码 接下来我们从代码入手,分析如何使用及其实现原理。假如现在要下载 http://hengdawb-app.os转载 2016-07-06 23:05:41 · 5616 阅读 · 2 评论 -
Retrofit自定义GsonConverter处理请求错误异常处理
通常从服务端拿到的JSON数据格式大概如下: { "code":1, "message":"查询成功", "detail":{"aa":"123","bb":"123","cc":"123"} }因此通常我们会定义一个实体类来解析对应的json:public class Response { @SerializedName("code") private转载 2016-08-07 21:41:45 · 12674 阅读 · 7 评论 -
Retrofit2实现App自动更新
原理Retrofit2和okhttp实现了apk的下载自定义类实现Retrofit2的Callback类在里面通过IO流写入文件并且使用RxBus订阅下载进度自定义类实现okhttp3的ResponseBody类并且在里面使用RxBus发布下载进度信息在Service中使用Retrofit在后台下载文件发送Notifaction到通知栏前台界面展示进度情况实现步骤1.创建UpdateMa转载 2016-08-07 21:17:18 · 7592 阅读 · 8 评论 -
Android Retrofit RxJava实现缓存
RxJava如何与Retrofit结合参考:http://blog.youkuaiyun.com/jdsjlzx/article/details/52015347缓存配置app网络数据的离线缓存实现有很多种办法,例如存进数据库(保存json使用时拿出来解析),存专有文件,或SharedPreference等等,也可以自己实现 LruCache 和 DiskLruCache 这两种缓存策略构成二级缓存(内存和磁盘转载 2016-08-03 23:57:00 · 6252 阅读 · 2 评论 -
Retrofit 使用flatmap操作符时处理错误、异常
在实际项目(Retrofit+RxJava框架)中,有时需要先登录,获取token后再去获取用户信息,那么我们需要把登录后服务器返回的信息进行筛选过滤等到我们需要的token,然后根据token获取用户信息。我们最终需要做的也就是转换数据流。RxJava中,具有转换数据流功能的操作符有很多,这里我们使用flatmap转换操作符来实现数据流的转换。在RESTResult对象里,包括请求返回的状态:失败原创 2016-08-02 17:35:52 · 7626 阅读 · 5 评论 -
Android Hack Retrofit 增强参数(固定参数)
今天为大家分享Prinln的文章: Android 下午茶:Hack Retrofit 之 增强参数谁是 Retrofit此处省去几百字。。。。可以看原文介绍。需求是折腾的动力源泉话说我最近开始忙活一个跟服务端交互颇多的项目,其中涉及到的全部 HTTP 请求都需要传入 5 个相同的参数,并需要根据其他所有参数动态生成一个参数。当时也没多想,用 retrofit 匆匆写完接口,结果就像这样:publ转载 2016-07-29 14:44:44 · 4154 阅读 · 2 评论 -
Retrofit2.0 公共参数(固定参数)
请先阅读: Retrofit 动态参数(非固定参数、非必须参数)(Get、Post请求)在实际项目中,对于有需要统一进行公共参数添加的网络请求,可以使用下面的代码来实现:RestAdapter restAdapter = new RestAdapter.Builder() .setEndpoint(ctx).setRequestInterceptor(new Req原创 2016-07-29 13:32:11 · 30090 阅读 · 14 评论 -
Android 初识Retrofit
什么是 Retrofit ?Retrofit是Square开发的一个Android和Java的REST客户端库。这个库非常简单并且具有很多特性,相比其他的网络库,更容易让初学者快速掌握。它可以处理GET、POST、PUT、DELETE…等请求,还可以使用picasso加载图片。常用注解Retrofit 2.0底层依赖OkHttp实现,也就是说Retrofit本质上就是对OkHttp的更进一步封装。R原创 2016-07-24 18:14:00 · 34956 阅读 · 21 评论 -
Retrofit 2.0 自定义Converter补充篇
请先阅读: Retrofit 2.0 自定义Converter在使用Retrofit请求数据时,一般都用Gson解析Json数据。有时候请求得到的 Json 字符串与返回值类型不对应,比如:{"err":0, "content":"This is a content.", "message":"OK"}返回值类型class Result{ int code;//等价于 err St原创 2016-07-19 21:21:50 · 15770 阅读 · 2 评论 -
Retrofit+RxJava 优雅的处理服务器返回异常、错误
开始本博客之前,请先阅读: Retrofit请求数据对错误以及网络异常的处理 异常&错误实际开发经常有这种情况,比如登录请求,接口返回的 信息包括请求返回的状态:失败还是成功,错误码,User对象等等。如果网络等原因引起的登录失败可以归结为异常,如果是用户信息输入错误导致的登录失败算是错误。假如服务器返回的是统一数据格式:/** * 标准数据格式 * @param <T> */publ原创 2016-07-11 17:32:39 · 61672 阅读 · 28 评论 -
RxJava 使用debounce操作符 优化app搜索功能
问题现在几乎所有的App都有搜索功能 , 一般情况我们监听EditText控件,当值发生改变去请求搜索接口. 如:etKey.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after转载 2016-06-21 21:01:38 · 6749 阅读 · 2 评论 -
RxJava zip操作符在Android中的实际使用场景
概述 Returns an Observable that emits the results of a specified combiner function applied to combinations of two items emitted, in sequence, by two other Observables.流程图: 简单来说zip操作符就是合并多个数据流,原创 2016-06-20 23:33:05 · 11875 阅读 · 0 评论 -
RxJava concat符操作处理多数据源
概述从concatMap操作我们知道,concat操作符肯定也是有序的,而concat操作符是接收若干个Observables,发射数据是有序的,不会交叉。使用示例示例一下面使用concat操作符 来实现个多数据源的例子,比如一个商品详情需要展示商品的信息、艺术家信息、与该商品类似的商品,可能需要访问三个接口。这个时候就可以使用concat操作符。卖家信息private Observable<Obj转载 2016-06-20 22:59:54 · 8174 阅读 · 1 评论 -
RxJava retryWhen操作符实现错误重试机制
业务需求当我们在app里发起网络请求时,可能会因为各种问题导致失败。如何利用RxJava来实现出现错误后重试若干次,并且可以设定重试的时间间隔。具体实现网络请求使用Retrofit来做,请求用户信息接口@GET("/userinfo?noToken=1") Observable<Response> getUserInfoNoToken();请求用户信息接口的逻辑代码转载 2016-06-20 17:45:21 · 14157 阅读 · 2 评论 -
RxJava concatMap操作符
concatMap 作用concatMap操作符和flatMap操作符非常类似。下面是concatMap操作符的流程图:concatMap和flatMap最大的区别是concatMap发射的数据集是有序的,flatMap发射的数据集是无序的。如下代码:Observable.from(Arrays.asList( "http://www.baidu.com/",转载 2016-06-20 14:57:45 · 5568 阅读 · 4 评论 -
Retrofit 传递数组参数
接触Retrofit一段时间后,感觉到Retrofit越来越强大,方便快捷。传数组@GET("v1/enterprise/find")Call<ResponseBody> getData(@Query("id") String id, @Query("linked[]") String... linked);代码调用:String id="Stay";String[] s = new Stri原创 2016-06-16 17:30:33 · 18387 阅读 · 1 评论 -
Retrofit 动态参数(非固定参数、非必须参数)(Get、Post请求)
关键词:Retrofit 动态参数、非固定参数、非必须参数有如下场景: 请求数据时: 1. 用户未登录时,不带参数userId; 2. 登录时带上参数userId.如下接口:@GET("index.php?r=default/homepage")Observable<Response<Exercise>> getDataList(@Query("page") int page)原创 2016-06-16 20:50:04 · 42036 阅读 · 6 评论 -
RxJava 方法备忘录
RxJava 方法过滤相关RxJava提供了filter()方法来过滤我们观测序列中不想要的值当我们不需要整个序列时,而是只想取开头或结尾的几个元素,我们可以用take()或takeLast()一个可观测序列会在出错时重复发射或者被设计成重复发射。distinct()和distinctUntilChanged()函数可以方便的让我们处理这种重复问题。(它会记录以及发射的值来过滤,所以请注意内存)fi转载 2016-06-16 00:06:33 · 2632 阅读 · 0 评论 -
RxJava Lift
RxJava 不建议开发者自定义 Operator 来直接使用 lift(),而是建议尽量使用已有的 lift() 包装方法(如 map() flatMap() 等)进行组合来实现需求,因为直接使用 lift() 非常容易发生一些难以发现的错误。 例子Observable.create(new Observable.OnSubscribe<String>() { @Override原创 2016-06-15 23:27:32 · 3153 阅读 · 0 评论 -
RxJava observeOn()与subscribeOn()的关系
RxJava系列教程:1. RxJava使用介绍 【视频教程】 2. RxJava操作符 • Creating Observables(Observable的创建操作符) 【视频教程】 • Transforming Observables(Observable的转换操作符) 【视频教程】 • Filtering Observables(Observable的过滤操原创 2016-06-15 22:17:36 · 23485 阅读 · 2 评论 -
Retrofit2 multpart多文件上传详解
可以先看看这个文章: Android Retrofit 实现(图文上传)文字(参数)和多张图片一起上传Retrofit2是目前很流行的android网络框架,运用注解和动态代理,极大的简化了网络请求的繁琐步骤,非常适合处理restfull网络请求。在项目中,经常需要上传文件到服务器,有时候是需要上传多个文件。网上文章基本都是单文件上传教程,这篇文章主要讲retrofit的多文件上传实现。 个人觉转载 2016-06-12 22:09:40 · 23628 阅读 · 4 评论 -
RxJava处理网络连接失败和timer()、interval()、delay()之间的区别
这篇文章算是对【译】对RxJava中.repeatWhen()和.retryWhen()操作符的思考的一个简单的补充,建议没看过的先看看上面这篇。前言才学RxJava的时候还是挺困惑的,感觉有特别多的对『时间』的操作符,比如timer()、interval()、delay()、defer()等等…… 总之功能太强大,直接吓跑了一群初学者。身边有朋友这样跟我说:RxJava为了省点代码,把逻辑弄这么转载 2016-06-08 18:44:32 · 4753 阅读 · 0 评论 -
Android RxJava的线程控制 —— Scheduler
Scheduler-调度器 If you want to introduce multithreading into your cascade of Observable operators, you can do so by instructing those operators (or particular Observables) to operate on particular Sche转载 2016-06-08 02:34:25 · 3020 阅读 · 1 评论 -
Android Retrofit网络请求Service,@Path、@Query、@QueryMap、@Map...
本篇是Retrofit Url 配置 http://blog.youkuaiyun.com/jdsjlzx/article/details/51588605博客的补充。GET请求多个参数在URL问号之后,且个数不确定http://api.stay4it.com/News?newsId=1&type=类型1… http://api.stay4it.com/News?newsId={资讯id}&type={类型}转载 2016-06-08 02:16:41 · 20713 阅读 · 9 评论 -
Retrofit 2.0文件上传
Android Retrofit 实现(图文上传)文字(参数)和多张图片一起上传 使用Retrofit进行文件上传,肯定离不开Part & PartMap。public interface FileUploadService { @Multipart @POST("upload") Call<ResponseBody> upload(@Part("description"原创 2016-06-05 11:16:25 · 27343 阅读 · 24 评论 -
Retrofit 泛型解析遇到com.google.gson.internal.LinkedTreeMap cannot be cast to object
在Retrofit网络请求数据,使用泛型解析json时,出现了com.google.gson.internal.LinkedTreeMap cannot be cast to com.xylife.community.bean.Exercise的异常,折腾了好久总算解决了。 先看下异常log:java.lang.ClassCastException: com.google.gson.interna原创 2016-06-05 23:55:53 · 33609 阅读 · 10 评论 -
Retrofit Url 配置
正文开始之前,先说个折腾了2天才搞清楚的事情。如果你用post请求进行提交数据(比如用户注册、登陆等表单类请求),参数类型一定要用准确,是Field,如果选择了Query,而调试过程没有发现这个问题,相信我你会发疯的。@FormUrlEncoded@POST("/some/endpoint")Call<Response> register(@Field("name") String name);原创 2016-06-05 11:14:35 · 23381 阅读 · 1 评论 -
Android Retrofit2&OkHttp3添加统一的请求头Header
在使用Retrofit时,有时候需要设置Set-Cookie等请求头,如果每一个url都需要,那么直接来个拦截器就好了。如下图所示:注意Header头,不要照抄,要灵活运用。让所有网络请求都附上你的 token:Interceptor mTokenInterceptor = new Interceptor() { @Override public Response intercept(Cha原创 2016-06-03 13:36:22 · 83272 阅读 · 6 评论 -
Retrofit请求数据对错误以及网络异常的处理
异常处理Retrofit本身会抛出HttpException,Gson解析会抛出解析异常, 此外我们还应该处理与服务器约定好的“异常”,即上一篇提到的返回数据中result字段值不会0的情况这里要先解决一个问题,就是Gson构建的对象,通过注解定义key名,以变量的类型定value的类型, 但如果同样的key在不同情况下属于不同的数据类型,就会出问题。 假如服务器返回格式是{ "re转载 2016-06-02 14:03:06 · 46281 阅读 · 10 评论 -
Retrofit Gson解析空字符串的问题
在实际开发项目中,服务器经常会用空字符串 “” 作为返回结果表示空值 ,但这在Gson当中就会遇到问题,如果这项数据的类型不是字符串,Gson解析就会报错 我们希望程序可以自动将空字符串解析为对应类型的空值,比如整型就解析为0,List型就解析为一个Empty List这个问题可以说是我用Retrofit+Gson以来最大的一个坑,以至于我在研究时差不多都要把源码看完了 提一件离奇的事是,G转载 2016-06-02 13:40:00 · 15324 阅读 · 16 评论 -
Retrofit 自定义Cookies
自定义Cookies拦截器:public class CookiesInterceptor implements Interceptor{ private Context context; public CookiesInterceptor(Context context) { this.context = context; } //重写拦截方法,处理自原创 2016-06-02 11:40:45 · 4676 阅读 · 0 评论 -
Retrofit实现App更新
Github代码:https://github.com/SpikeKing/wcl-update-request-demo逻辑访问服务器, 根据是否包含新版本, 判断是否需要更新. 下载Apk, 下载完成后, 自动安装, 高版本会覆盖低版本.逻辑:public class MainActivity extends AppCompatActivity { private static fin转载 2016-06-01 00:07:26 · 6897 阅读 · 1 评论 -
Retrofit缓存网络数据RxCache--RxJava和数据库
RxJava是响应式编程, 在异步处理网络数据时, 使用广泛。 我们也可以使用一些Rx的特性, 优雅地缓存网络数据.缓存模式: 读取数据库, 显示, 请求数据, 存储到数据库, 再更新页面.SpikeKing 大神github地址:https://github.com/SpikeKing 代码:https://github.com/SpikeKing/wcl-rx-cache-demo使用Dag转载 2016-05-31 23:58:16 · 10909 阅读 · 1 评论 -
RxJava Subscription 自动取消订阅
在RxJava Observer与Subscriber的关系 一文中,我们提到: subscribe(mObserver)和subscribe(mSubscriber)执行结果就会有区别: subscribe(mSubscriber)这种订阅方式在第二次请求数据时就不会执行了,原因就是第一次onNext后自动取消了订阅; subscribe(mObserver)则不出现此问题原创 2016-05-30 23:09:21 · 27702 阅读 · 8 评论 -
Retrofit + RxJava 业务状态重定向及分离
问题本文主要介绍了在 Retrofit + RxJava 环境下更优雅的解决了以下两个问题:将接口业务上的失败重定向到 onError(Throwable e) 输出;业务成功时分离出 data 数据由 onNext(T t) 输出;场景一般来说,一个友好的接口返回 json 应该是这样的:{ "code":200, "codeMsg":"查询成功!", "data":转载 2016-05-30 22:15:33 · 3061 阅读 · 0 评论 -
RxAndroid之Rxlifecycle使用
随着Android第三库的普及,RxJava和RxAndroid(https://github.com/ReactiveX/RxAndroid)越来越被人熟知,简洁的语法,配合Java8 Lambda表达式,使代码的结构更加清晰,通过线程调度器更容易控制和切换线程,种种优点,使用它的人也越来越多。但是使用不好,很容易导致内存泄露。Rxlifecycle (https://github.com/tre原创 2016-05-29 00:12:23 · 38258 阅读 · 9 评论 -
RxJava Observer与Subscriber的关系
在说Observer与Subscriber的关系之前,我们下重温下相关概念。RxJava 的观察者模式RxJava 有四个基本概念:Observable (可观察者,即被观察者)、 Observer (观察者)、 subscribe (订阅)、事件。Observable 和 Observer 通过 subscribe() 方法实现订阅关系,从而 Observable 可以在需要的时候发出事件来通知原创 2016-05-29 22:37:57 · 24892 阅读 · 3 评论 -
使用RxJava来改进用户体验
一个完美的移动世界永远不会失去连接,而服务端也永远不会返回错误。构建一个很棒的app对于用户来说是幸福的事而对于开发者来说则是痛苦的事。用户点击一个按钮就阻塞了所有操作的时代已经过去了,那是要死人的。让我们来创建一个更好的文本框搜索功能并关注以下需求尽可能少的请求对用户尽可能少的错误信息RX 的逻辑相当简单,重点在完善细微的细节上。让我们从简单的逻辑开始:当用户输入内容的时候我们发出了一个网络请求转载 2016-05-29 00:04:55 · 4035 阅读 · 1 评论 -
用 Retrofit 2 简化 HTTP 请求(Jake Wharton)
Retrofit 作为简化 HTTP 请求的库,已经运行多年,2.0版本依然不辱使命的在做这些事情。不过 2.0 版本修复了一些长期影响开发者的设计,还加入了前所未有的强大特性。在 NYC 2015 的这一个分享中,Jake Wharton 的演讲涵盖了所有 Retrofit 2.0 的新特性,全面介绍了 Retrofit 2.0 工作原理。Transcription below provided转载 2016-05-28 10:39:17 · 3936 阅读 · 1 评论 -
Android Retrofit 请求字符串(非JSON数据)
在使用Retrofit来作为网络请求库之后,笔者查阅了网上的有关教程,无外乎都是请求json数据,使用addConverterFactory(GsonConverterFactory.create())来作为转化器,如果业务需求是请求 字符串,而不是json数据格式呢,继续使用这个转换器就会产生错误。好,来到正题,如何使用Retrofit请求一段字符串: 来到官方文档查阅:http://squa转载 2016-05-28 01:06:29 · 8220 阅读 · 0 评论