RxJava2 和 Retrofit2 结合使用详解

  • 时间:
  • 浏览:0

通过map操作符,Int 类型数据,到 Consumer 里肯能成了 String(这里为了简单的只看数据就没用 Observer 而改用 Consumer,两者还要)。这底下用到了Function,它的第4个 泛型是 Observable 中发射的数据类型,第4个泛型是当我门你还还还可以装换完后 的数据类型,在 Function 的 apply 法子中手动完成数据的转化。

示意图:map 把圆的变成了方的。

蕴含 4个 参数,分别负责onNext、onError和onComplete的回调。

同样,4个 参数必须有一些种搭配

首先创建 Observable 和 Observer,过后 observable.subscribe(observer),另4个 Observable 发出的事件就会被 Observer 响应。一般当我门不手动创建 Observable,好多好多 由 Retrofit 返回给当我门,当我门拿到 Observable 完后 只需关心如保操作 Observer 中的数据即可。

不过为了由浅入深的演示,还是手动创建 Observable 来讲解。

与 map 这类于,不过 flatMap 返回的是4个 Observable,也好多好多 说 Function 的第4个泛型固定了,好多好多 Observable,另4个 说不太好理解,看个例子:

过后我我现在有多个学生,每个学生有多个科目,每个科目考了多次试,现在要打印所有的分数。单单只用 map 就必须直接背熟,试试吧

log 打印情况:

CompositeDisposable 还要用来管理多个 Disposable,通过add()法子添加 Disposable 对象,过后在 onDestroy 法子底下调用clear()肯能dispose()来清除所有的 Disposable,另4个 还要除理内存泄漏。

getLatestNews 函数返回类型是 Call,一些是 Retrofit 定义用来请求网络的。

第三段代码,现实创建了4个 Retrofit 对象,addConverterFactory(GsonConverterFactory.create())是把接口返回的 json 类型的数据转添加实体类的类型,一些东西在implementation 'com.squareup.retrofit2:converter-gson:2.6.2'时被引入。

还要看一遍,调用dis.dispose()后,就没哟打印上游发射的"RxJava"和"GoodBye"了。

常见的 button 点击事件为例,button 是被观察者,listener 是观察者,setOnClickListener 过程是订阅,有了订阅关系后在 button 被点击的完后 ,监听者 listener 就还要响应事件。

最后介绍一下这4个 类,Disposable前文出现过,在 Observer 的 onSubscribe 函数中,4个 Disposable 类型的参数:override fun onSubscribe(d: Disposable) {},通过前面介绍当我门知道,Observable 和 Observer 建立订阅关系还还可以 调用 onSubscribe 法子,过后没法 说一些参数的作用。

除了 Observable 来源变了,一些与本文最早讲的 RxJava 没哪几种不同。必须说不同,有一些,多了一句subscribeOn(Schedulers.newThread()),下面讲讲一些。

这4个 词意思分别是消费者(还要理解为消费被观察者发射出来的事件)和行为(还要理解为响应被观察者的行为)。对于 Observer 中的 4 个回调法子,当我门暂且都能用得到,肯能只还要用到其中的一每段,就还要 Consumer 和 Action 上场了。

肯能你还还还可以4个 蕴含 4个 Consumer 过后都有一些搭配(比如subscribe(Consumer<? super T> onNext, Consumer<? super Disposable> onSubscribe)),还要吗?答案是:不行

通过两层 for 循环还要打印,这也是没法 子的事,肯能在 map 底下必须拿到 Course 集合。使用 flatMap 的情况是另4个 的:

Disposable 的 dispose() 函数还要用来解除订阅,另4个 就不必收到 Observable 发射的事件:

filter是过滤的意思,通过判断算不算符合当我门你还还还可以的逻辑,来决定算不算发射事件,必须返回 true 的事件才被发射,一些的被背叛。还以底下的例子为例,过后我我当我门只看一遍 1000 分以上的成绩还要另4个 过滤:

这句的效果等同于底下用 create 创建 observable,即 调用 3 次 onNext 后再调 onComplete。

啰嗦了没法 多,才讲到这里。抱歉水平有限,没法 子用简单的语言说清繁杂的什么的问题。

首先,引入依赖时多加一句对 RxJava 的支持:

好多好多 每次调用observeOn就会切换应用程序,过后决定的是接下来的变换/响应的应用程序。多说一句,多次设置 subscribeOn,必须第一次生效

好吧,我在扯淡。继续讲,人们说不喜欢 url 被截成两段,还要另4个 修改,效果完整版相同:

放心写,不必报错,有了 Observable,就好办了,轻车熟路:

先引入依赖,过后当我门请求4个 知乎日报的新闻数据(点击查看数据:https://news-at.zhihu.com/api/4/news/latest):

一些情况和直接 new 出来的 Observer 效果一样。

这底下必须doOnNext没讲过,现在话语:每发送 onNext() 完后 还还可以 先回调一些法子,好多好多 doOnNext 和 Observable 的 subscribe(发射事件的法子)指在同4个 应用程序。

从一些例子还要看出:

说明一下,肯能 subscribe 中当我门只传4个 对象参数,那必须是subscribe(Consumer<? super T> onNext)(onNext 法子),必须是 Action 或 Consumer<? super Throwable> onError、Consumer<? super Disposable> onSubscribe

比如当我门想把上游的 Int 类型的数据转添加 String 还要另4个 操作:

应用程序切换比较常见,比如 子应用程序请求网络数据主应用程序更新 UI,subscribeOnobserveOn有哪几种应用程序还要挑选?它们又是如保使用的?当我门先看4个 例子:

注意,filter 底下都有用 Function 了,好多好多 Predicate,一些单词是“基于...”的意思,基于 t > 1000,也好多好多 挑选大于 1000 分的成绩。

过后,当我门的 getLatestNews 就还要直接返回4个 Observable 了!

蕴含 4个 Consumer 参数,分别负责 onNext 和 onError 的回调。

==注意==:Consumer 中的回调法子名称是 accept,区别于前面的 onNext

应用程序可选值

这句的效果等同于底下用 create 创建 observable,即 调用 3 次 onNext 后再调 onComplete。

过后是一系列的 Call 调用 qnqueue 操作哪几种的,看得出,没法 用 Rxjava 一样还要完成网络请求,过后代码不繁杂,好了,本文到此现在开始了了。

==注意==:Action 中的回调法子名称是 run,区别于前面的 onComplete

多说一句,通过查看RxJava2CallAdapterFactory.create()源码可知,dispose()法子能主动断开 Observable 和 Observer 之间的连接,还能归还 Retrofit 的网络请求,好多好多 放心的用吧。

代码很糙多,分别解释一下,ZhEntity 是实体类,ApiService 是4个 接口,底下用注解的法子定义了4个 法子 getLatestNews,@GET表示 Get 请求,由此还要想象肯定有@POST@GET底下还有参数,这是请求地址 BaseUrl 底下的子文件夹。

ObservableOnSubscribeObservableEmitter都有陌生人,一些好多好多 完整版讲涉及到源码分析,东西可就多了(主好多好多 太熟悉),好多好多 还要理解成 ObservableOnSubscribe 是用来帮助创建 Observable 的,ObservableEmitter 是用来发出事件的(哪几种事件在观察者 Observer 中还要响应除理)。

emitter 一次发射了4个 事件,过后调用了 onComplete() 哪几种在下面讲观察者 Observer 时还还可以 提到,一起讲解。

还要看一遍,先是建立订阅关系,过后根据前面 observable 的发射顺序来打印 onNext,参数通过 onNext(t: String) 传进来,最后调用 onComplete,多说一句,在 just 和 fromIterable 的情况下,没法 手动调用 Emitter,过后仍会先调用 onNext,最后调用 onComplete

有参数的onSubscribeonNextonError当我门用 Consumer 来代替,无参的onComplete用 Action 代替:

这里的button.setOnClickListener(listener)看上去意思是被观察者订阅了观察者(杂志订阅了读者),逻辑上不符合日常生活习惯。我我确实这是设计模式的习惯,暂且纠结,习惯了一些模式就能助 理解观察者模式了。

图我确实画的丑,过后我要意思比较明白了。

用了两次 flatMap,链式调用比缩进式更清晰。这底下的 flatMap 返回值类型的是 ObservableSource 并都有当我门在前面提到的 Observable,查看 Observable 源码还要看一遍,它继承了 ObservableSource,好多好多 一些多态用法是还要的。

另外在 apply 中返回的Observable.fromIterable(t.courses)一些句不好多好多 当我门创建 Observable 的法子吗?

简单的说,map 是把 Observable 发射的数据变换一下类型,flatMap 是把数据中集合/数组中的每个元素再次通过 Observable 发射。

示意图:faltMap 把一系列圆的通过一系列的 Observable 变成了一系列方的。

前面 3 小节讲了好多好多 ,都有为了讲清楚 RxJava 的整个工作流程,还没涉及到应用程序切换。现实开发中更多的完后 Observable 是通过 Retrofit 返回给当我门的。Retrofit 是4个 网络请求框架,它基于 OkHttp3,做了更好的封装,结合 RxJava 用惯了话语还要大大提到开发速率。还是一样,当我门只看为甚么用,不涉及源码解读。

baseUrl 还是要的,不过设置成一些值无所谓了,肯能不必被请求。

不讲 rxjava 和 retrofit 好多好多 直接上手 2 了,肯能 2 封装的更好用的更多。

在底下的例子中,Observable 发送的都有 String 类型的数据,好多好多 在 Observer 中接收的也都有 String,现实开发中的数据多种多样,过后有完后 Observable 提供的数据都有当我门理想的情况,一些情况下就还要用到转换操作符。

同样当我门只讲常用的:

常见的几种法子,不常用的不写了,肯能我我确实一些模块都有重点。