RxJava

关于Observable interval定时任务停止问题

风流意气都作罢 提交于 2020-04-10 21:55:29
本文不分析操作符的使用方法,主要分析interval轮询中如何来停止。 最近在项目中使用RxJava,RxAndroid;主要运用于网络请求,但是项目中有用到定时任务,每隔20s去更新数据,因此想到RxJava中有定时器操作符,再加上已经引入RxJava,链式请求就完成了,详见代码: Observable.interval(0, 20, TimeUnit.SECONDS) .doOnSubscribe { mDisposable = it } .flatMap { return@flatMap DataUtils.API_SERVICE.getQrCode(userId) } .map { val body = it.string() val str = body.substring(body.indexOf(",") + 1) val decodedString = Base64.decode(str, Base64.DEFAULT) return@map BitmapFactory.decodeByteArray(decodedString, 0, decodedString.size) } .compose(ThreadFromUtils.defaultSchedulers()) .subscribe({ dismissProgressDialog() qr_code

RxJava2+Retrofit2+RxLifecycle3+OkHttp3网络请求封装(动态演示)

感情迁移 提交于 2020-04-10 11:21:11
入职公司后,公司要求组件化开发,经过讨论后我将网络请求框架单独进行了封装,不过当时框架里将常用的 util 和 ui 均放入到了共同的 Common 包下,导致里面部分代码耦合,后来为了降低耦合性又将 Common 拆分为了lib_common和lib_ui,但是 lib_ui 依赖了 lib_common,还是导致部分代码耦合,最新一期为了降低组件之间的耦合性,所以单独将 lib_common 中的网络请求单独拆分,并且我又做了新的封装和完善,总之网络框架经过3次大的改造后,使用已经非常稳定了。 使用步骤 1.在Application类中进行初始化操作 ApiConfig build = new ApiConfig.Builder() .setBaseUrl(baseUrl)//BaseUrl,这个地方加入后项目中默认使用该url .setInvalidateToken(0)//Token失效码 .setSucceedCode(200)//成功返回码 .setFilter("com.mp5a5.quit.broadcastFilter")//失效广播Filter设置 //.setDefaultTimeout(2000)//响应时间,可以不设置,默认为2000毫秒 //.setHeads(headMap)//动态添加的header,也可以在其他地方通过ApiConfig

RxJava join操作-31

烈酒焚心 提交于 2020-04-09 04:50:21
原文:https://github.com/Froussios/Intro-To-RxJava/blob/master/Part 4 - Concurrency/3. Sequences of coincidence.md join允许您将两个序列中的项组合在一起。我们已经看过zip,它根据index对值进行配对。join允许您根据时间配对值。让我们先看一下方法签名: join合并两个序列,称为“left(左)”和“right(右)”。该方法不是静态(static)的,在方法签名中,我们可以看到两个名为leftDurationSelector和rightDurationSelector的方法,它们将相应序列的项作为参数。它们返回一个定义持续时间(即window)的observable。这些window用于选择要配对的值。配对的值将传递给resultSelector函数,该函数将它们组合成单个值,就像zip中的resultSelector一样,该值将由join发出。 这使join变得强大,但也很难理解的是,如何选择值进行配对。到达序列中的每个值都会为自己开一个window。相应的持续时间选择器决定每个值的window何时终止。当window打开时,以相反顺序到达的任何值都将与它配对。这个过程对于左右序列是对称的,所以让我们考虑一个只有一个序列的项目有window的情况。

RxJava系列10:理解rxjava中的compose

别等时光非礼了梦想. 提交于 2020-03-24 14:33:54
3 月,跳不动了?>>> 理解rxjava中的compose 一.compose基本概念及使用 引入: 1 2 如果我们相对多个流重复利用一系列操作符该怎么办? 一种方式是,提取一个工具方法,把复用的地方抽取成一个方法applySchedulers。 1 2 另外一种方法就是使用compose. compose常和Transformers。 Transformers 1 2 3 4 换句话说就是提供给他一个Observable它会返回给你另一个Observable,这和lift等操作符有着同等功效。 例如: 定义一个Transformers。 1 2 3 4 5 6 7 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 好处在于: 1.实现一系列操作符的复用 2.不破坏链式调用的结构 二.和flatmap的区别 1 2 3 4 5 6 7 三.应用场景示例 可参考rxlifecycle绑定生命周期的时候就是使用的compose方法来复用一些处理逻辑。 来源: oschina 链接: https://my.oschina.net/u/1177694/blog/1936582

RxJava 学习笔记<十三> startWith 操作符

我怕爱的太早我们不能终老 提交于 2020-03-04 18:08:01
在应用到可观察到的序列之前,StartWith先取一个序列并将其串联起来。 输出: StartWith 是用 concat 和 just 处理我们序列的缩减名称。 并发序列 可观测值并不总是在可预测的时刻发出值。现在,我们将看到一些用于组合同时发出值的序列的运算符。 amb amb 获取多个可观测值,并返回首先发出值的一个,其余的都被丢弃了。 在下面的示例中,amb 将镜像第二个可观察到的对象,因为它等待启动的时间较短。 输出: 它的用处可能并不明显。 如果您有多个可以提供值的廉价资源,但是延迟是广泛可变的,则amb特性非常有用。例如,您可能在世界各地复制了服务器。对于客户机发送和服务器响应来说,发出查询都很便宜,但是,由于网络条件,延迟是不可预测的,并且变化很大。使用Amb操作符,您可以向许多服务器发送相同的请求,并使用第一个响应的结果。 另一种做AMB的方式是ambWith操作符,ambWith允许您将可观察到的数据逐个组合在一个链中。当在链或操作符中间使用amb时,这更方便。 输出: 原文链接: https://github.com/Froussios/Intro-To-RxJava/blob/master/Part%203%20-%20Taming%20the%20sequence/4.%20Combining%20sequences.md 有什么讨论的内容

RxJava之subscribeOn解惑

不羁的心 提交于 2020-03-02 04:37:28
RxJava之subscribeOn解惑 有一天,我在使用RxJava和Retrofit实现Android上面的网络请求。突然,遇到了一个坑,在过了这些坑之后得到一些经验,觉得需要和大家分享一二。 引子 用Retrofit搭配RxJava的朋友应该都知道,一般实现代码最终大都长得一幅下面的样子。 public interface BeanApi { @GET("bean/{id}") Observable<Bean> getBean(@Path("id") int beanId); } BeanApi api = ···通过Retrofit的create实例化··· api.getBean(1) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe( bean -> { // do something on main thread. }, throwable -> { // do something on main thread. } ); 上面的代码形式相信各位都写得很熟了,但是我实在烦透了每个api调用的地方都写一次subscribOn,observeOn。然后,我找到一篇不错的文章—— Don't break the chain: use RxJava's

RxJava 学习笔记<二> subject

十年热恋 提交于 2020-02-28 22:55:38
Subjects 是一个继承了 Observable 和实现 Observer 的接口,咋看之下看起来有点奇怪,但是在很多情况可以让代码写起来简单。 Subjects的实现有很多,我们可以看几个例子,了解他们的不同之处 PublishSubject PublishSubject的操作是最直截了当的,当一个值被推到 PublishSubject中,这个 subject 就会把数据给到每个 subscriber,1 没有输出是因为在他 push 的时候没有 subscribed 输出: ReplaySubject ReplaySubject有一个缓存所有推向它数据的特性,当一个新的subscription建立,时间流将会重新开始推向subscriber,之后的就像 PublishSubject 实现一样。在看ReplaySubject的第二个例子可以知道,缓存所有的不是一个好主意,这样 observable 序列会执行很长时间,我们可以使用 ReplaySubject.createWithSize 限制缓存的大小。在第三个例子中可以看出使用 ReplaySubject.createWithTime 限制缓存的时间。 输出: BehaviorSubject BehaviorSubject仅仅保留最后一个值,类似于 ReplaySubject 设置缓存一个,当创建的时候

Rxjava2 Observable的布尔操作符详解及实例

╄→尐↘猪︶ㄣ 提交于 2020-01-07 02:02:32
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 简要: 需求了解: 在 Rxjava 的众多操作符中,有数据变换、过滤等,但是有的时候是不是有一些 判断的操作 呢?比如判断一个 Observable 的所有数据是否满足一个指定的条件,判断某个 Observable 是否会发射一个指定的值等等的判断操作,答案是肯定的,Rxjava 中提供了一系列的 布尔条件判断操作符 。 Rxjava 中的布尔操作符主要包括: All :判断是否所有的数据项都满足某个条件。 Contains :判断 Observable 是否会发射一个指定的值。 IsEmpty :判断原始Observable是否未发射任何数据。 SequenceEqual :判断两个 Observables 发射的序列是否相等。 1. All 判断是否所有的数据项都满足某个条件。 解析: 传递一个谓词函数( predicate )给 All 操作符,这个函数接受原始 Observable 发射的数据,根据计算返回一个布尔值。 All 返回一个只发射一个单个布尔值的 Observable,如果原始 Observable 正常终止并且 每一项数据都满足条件 ,就返回 true ;如果原始 Observable 的 任何一项数据不满足条件 就返回 false 。 示例代码: /** * all(Predicate

Rxjava2 介绍与详解实例

依然范特西╮ 提交于 2020-01-07 02:00:16
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 前言 现在我们可以看到越来越多的开发者都在使用 Rx 相关的技术进行 App,Java 后端等领域进行开发。在开源的社区以及互联网公司,Rx、响应式编程、函数式都是热门的存在。所以笔者将结合自身的学习以及实际使用情况,写一个针对 Rxjava2 的系列文章,一起学习和使用 Rxjava 所带来的便捷。 笔者将利用工作之余,结合 ReactiveX 官方 Wiki 对 Rxjava 的定义与介绍,对相关基础知识、基本操作,常用部分的 API 进行整理,并加上个人理解和相关操作的示例。 相关参考链接: 官网 Wiki GitHub Api-Doc Rxjava2 系列文章目录: Rxjava2 介绍与详解实例 Rxjava2 Observable的创建详解及实例 Rxjava2 Observable的数据变换详解及实例(一) Rxjava2 Observable的数据变换详解及实例(二) Rxjava2 Observable的数据过滤详解及实例(一) Rxjava2 Observable的数据过滤详解及实例(二) Rxjava2 Observable的结合操作详解及实例 Rxjava2 可连接的Observable(ConnectableObservable)操作详解及实例 Rxjava2

异步编程之美

只愿长相守 提交于 2019-12-30 18:45:16
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 在大学毕业后的工作期间,从最开始的编写同步代码,到慢慢为了提高系统性能,把一些任务使用异步的方式来处理,从而提高系统的响应时间,那么就会产生一些新的问题,如何监控在异步线程执行的任务的执行状态,是否出现了错误,出现了错误怎么处理,系统创建大量线程又该如何统一管理,这些种种问题都让使我意识到深入了解异步编程的必要性。 同步的代码, 在很多情况下, CPU其实是在等待中度过的, 比如等待一个网络连接, 等待MySQL服务器的数据返回异步的代码, 就是把这些等待的时间给充分利用起来了, 把网络连接, 访问数据库这种耗时的工作时都在注册一个callback或者event之后切换出来,让CPU先去干别的活(例如响应别的请求), 当网络连接,数据库返回结果时再回来执行刚才的callback中的代码,异步的代码可以大大的提升系统的容量上限, 因为充分利用了空闲的CPU时间, 但是对于单个的请求的性能提升帮助比较有限 (除非你的单个请求大量依赖这种IO操作)。 Java的异步编程其实是一个充分利用计算机CPU资源,不想让主程序阻塞在某个长时间运行的任务上,这类耗时的任务可以是IO操作、远程调用以及高密度计算任务。如果不使用多线程异步编程,我们的系统就会阻塞在耗时的子任务上,会导致极大延长完成主函数任务的时间