RXjava解析(二)我把RXjava的源码和这份面试都给你了,你还告诉我面不过拿不到offer?

就在前不久做了一个关于RXJava的相关教学视频,过后整理了关于RxJava的预习资料和相关内容以及图文和相关源码,需要借鉴的可以和我联系~

承接上文:我把RXjava的源码和这份面试都给你了,你还告诉我面不过拿不到offer?(一)
源码和面试大全PDF
(VX:mm14525201314)

RxJava

RxJava中,一个实现了Observer接口的对象可以订阅(subscribe)一个Observable 类的实例。订阅者(subscriber)对Observable发射(emit)的任何数据或数据序列作出响应。这种模式简化了并发操作,因为它不需要阻塞等待Observable发射数据,而是创建了一个处于待命状态的观察者哨兵,哨兵在未来某个时刻响应Observable的通知。

####Single

介绍

RxJava(以及它派生出来的RxGroovyRxScala)中有一个名为Single的Observable变种。Single类似于Observable,不同的是,它总是只发射一个值,或者一个错误通知,而不是发射一系列的值。

因此,不同于Observable需要三个方法onNext, onError, onCompleted,订阅Single只需要两个方法:

  • onSuccess- Single发射单个的值到这个方法
  • onError - 如果无法发射需要的值,Single发射一个Throwable对象到这个方法

Single只会调用这两个方法中的一个,而且只会调用一次,调用了任何一个方法之后,订阅关系终止

Single的操作符

Single也可以组合使用多种操作,一些操作符让你可以混合使用Observable和Single:

Subject

Subject可以看成是一个桥梁或者代理,在某些ReactiveX实现中(如RxJava),它同时充当了ObserverObservable的角色。因为它是一个Observer,它可以订阅一个或多个Observable;又因为它是一个Observable,它可以转发它收到(Observe)的数据,也可以发射新的数据。

由于一个Subject订阅一个Observable,它可以触发这个Observable开始发射数据(如果那个Observable是"冷"的--就是说,它等待有订阅才开始发射数据)。因此有这样的效果,Subject可以把原来那个"冷"的Observable变成"热"的。

Subject的种类

针对不同的场景一共有四种类型的Subject。他们并不是在所有的实现中全部都存在,而且一些实现使用其它的命名约定(例如,在RxScala中Subject被称作PublishSubject)。

AsyncSubject

一个AsyncSubject只在原始Observable完成后,发射来自原始Observable的最后一个值。(如果原始Observable没有发射任何值,AsyncObject也不发射任何值)它会把这最后一个值发射给任何后续的观察者。

然而,如果原始的Observable因为发生了错误而终止,AsyncSubject将不会发射任何数据,只是简单的向前传递这个错误通知

BehaviorSubject

当观察者订阅BehaviorSubject时,它开始发射原始Observable最近发射的数据(如果此时还没有收到任何数据,它会发射一个默认值),然后继续发射其它任何来自原始Observable的数据。

然而,如果原始的Observable因为发生了一个错误而终止,BehaviorSubject将不会发射任何数据,只是简单的向前传递这个错误通知

PublishSubject

PublishSubject只会把在订阅发生的时间点之后来自原始Observable的数据发射给观察者。需要注意的是,PublishSubject可能会一创建完成就立刻开始发射数据(除非你可以阻止它发生),因此这里有一个风险:在Subject被创建后到有观察者订阅它之前这个时间段内,一个或多个数据可能会丢失。如果要确保来自原始Observable的所有数据都被分发,你需要这样做:或者使用Create创建那个Observable以便手动给它引入"冷"Observable的行为(当所有观察者都已经订阅时才开始发射数据),或者改用ReplaySubject

如果原始的Observable因为发生了一个错误而终止,PublishSubject将不会发射任何数据,只是简单的向前传递这个错误通知。

ReplaySubject

ReplaySubject会发射所有来自原始Observable的数据给观察者,无论它们是何时订阅的。也有其它版本的ReplaySubject,在重放缓存增长到一定大小的时候或过了一段时间后会丢弃旧的数据(原始Observable发射的)。

如果你把ReplaySubject当作一个观察者使用,注意不要从多个线程中调用它的onNext方法(包括其它的on系列方法),这可能导致同时(非顺序)调用,这会违反Observable协议,给Subject的结果增加了不确定性。

RxJava的对应类

假设你有一个Subject,你想把它传递给其它的代理或者暴露它的Subscriber接口,你可以调用它的asObservable方法,这个方法返回一个Observable。具体使用方法可以参考Javadoc文档。

串行化

如果你把 Subject 当作一个 Subscriber 使用,注意不要从多个线程中调用它的onNext方法(包括其它的on系列方法),这可能导致同时(非顺序)调用,这会违反Observable协议,给Subject的结果增加了不确定性。

要避免此类问题,你可以将 Subject 转换为一个 SerializedSubject,类似于这样:

  mySafeSubject = new SerializedSubject( myUnsafeSubject );

调度器 Scheduler

如果你想给Observable操作符链添加多线程功能,你可以指定操作符(或者特定的Observable)在特定的调度器(Scheduler)上执行。

某些ReactiveX的Observable操作符有一些变体,它们可以接受一个Scheduler参数。这个参数指定操作符将它们的部分或全部任务放在一个特定的调度器上执行。

使用ObserveOnSubscribeOn操作符,你可以让Observable在一个特定的调度器上执行,ObserveOn指示一个Observable在一个特定的调度器上调用观察者的onNext, onErroronCompleted方法,SubscribeOn更进一步,它指示Observable将全部的处理过程(包括发射数据和通知)放在特定的调度器上执行。

RxJava示例

调度器的种类

下表展示了RxJava中可用的调度器种类:

默认调度器

在RxJava中,某些Observable操作符的变体允许你设置用于操作执行的调度器,其它的则不在任何特定的调度器上执行,或者在一个指定的默认调度器上执行。下面的表格个列出了一些操作符的默认调度器:

使用调度器

除了将这些调度器传递给RxJavaObservable操作符,你也可以用它们调度你自己的任务。下面的示例展示了Scheduler.Worker的用法:

  worker = Schedulers.newThread().createWorker();
  worker.schedule(new Action0() {
?  [email protected]
  ??public void call() {
?  ???yourWork();
  ?}
  });
  // some time later...
  worker.unsubscribe();

递归调度器

要调度递归的方法调用,你可以使用schedule,然后再用schedule(this),示例:

  worker = Schedulers.newThread().createWorker();
  worker.schedule(new Action0() {
??  @Override
??  public void call() {
????  yourWork();
????  // recurse until unsubscribed (schedule will do nothing if unsubscribed)
????  worker.schedule(this);
  ?}
  });
  // some time later...
  worker.unsubscribe();

检查或设置取消订阅状态

Worker类的对象实现了Subscription接口,使用它的isUnsubscribed和unsubscribe方法,所以你可以在订阅取消时停止任务,或者从正在调度的任务内部取消订阅,示例:

  Worker worker = Schedulers.newThread().createWorker();
  Subscription mySubscription = worker.schedule(new Action0() {

       @Override
       public void call() {
           while(!worker.isUnsubscribed()) {
               status = yourWork();
               if(QUIT == status) { worker.unsubscribe(); }

           }
       }
  });

Worker同时是Subscription,因此你可以(通常也应该)调用它的unsubscribe方法通知可以挂起任务和释放资源了。

延时和周期调度器

你可以使用schedule(action,delayTime,timeUnit)在指定的调度器上延时执行你的任务,下面例子中的任务将在500毫秒之后开始执行:

  someScheduler.schedule(someAction, 500, TimeUnit.MILLISECONDS);

使用另一个版本的schedule,schedulePeriodically(action,initialDelay,period,timeUnit)方法让你可以安排一个定期执行的任务,下面例子的任务将在500毫秒之后执行,然后每250毫秒执行一次:

  someScheduler.schedulePeriodically(someAction, 500, 250, TimeUnit.MILLISECONDS);

测试调度器

TestScheduler让你可以对调度器的时钟表现进行手动微调。这对依赖精确时间安排的任务的测试很有用处。这个调度器有三个额外的方法:

  • advanceTimeTo(time,unit) 向前波动调度器的时钟到一个指定的时间点
  • advanceTimeBy(time,unit) 将调度器的时钟向前拨动一个指定的时间段
  • triggerActions( )开始执行任何计划中的但是未启动的任务,如果它们的计划时间等于或者早于调度器时钟的当前时间

顺手留下GitHub链接,需要获取相关面试等内容的可以自己去找
https://github.com/xiangjiana/Android-MS
(VX:mm14525201314)

原文地址:https://blog.51cto.com/14541311/2465363

时间: 2024-11-07 01:13:36

RXjava解析(二)我把RXjava的源码和这份面试都给你了,你还告诉我面不过拿不到offer?的相关文章

我把RXjava的源码和这份面试都给你了,你还告诉我面不过拿不到offer?(一)

就在前不久做了一个关于RXJava的相关教学视频,过后整理了关于RxJava的预习资料和相关内容以及图文和相关源码,需要借鉴的可以和我联系~ 一丶 面试辅助路线(全部内容在完整的PDF里都有讲解) (顺手留下GitHub链接,需要获取相关面试等内容的可以自己去找)https://github.com/xiangjiana/Android-MS(VX:mm14525201314) 二丶 RXJava预习: JAVA设计模式之观察者模式 1.初步认识 观察者模式的定义:在对象之间定义了一对多的依赖,

spring深入理解二(关于容器工作源码)

spring基本工作原理如下: 1.查找bean配置文件 2.加载bean配置文件并解析生成中间表示BeanDefinition 3.注册beanDefinition 4.如果是单例或lazy-init=false,则直接生成bean spring将 1.查找bean配置文件 2.加载bean配置文件并解析生成中间表示BeanDefinition 3.注册beanDefinition 这三部分开,可以提供更多的定制给用户. spring将配置文件之类的文件资源抽象成一个Resource,封装了g

二人牛牛机器人构造源码

本次为大家分析二人牛牛机器人构造源码如下:#include "StdAfx.h"#include "AndroidServiceManager.h"#include "AndroidUserItemSink.h"////////////////////////////////////////////////////////////////////////////构造函数CGameServiceManager::CGameServiceManage

千创伟业二二复制公排系统源码开发

千创伟业二二复制公排系统源码开发,开发系统找:陈经理136-4273-5391 千创伟业系统,千创伟业模式,千创伟业平台开发,千创伟业开发系统,千创伟业软件开发.本文章是做系统开发咨询的,并非官方平台运营商,玩平台者勿扰!谢谢配合! 这是一个移动互联网时代,也是一种跨界打劫的时代,这是一种2G手机还舍不得丢,5G已经悄然兴起的时代,这是一个海盗嘉年华的时代,今天你还在墨守成规,他却直接跨界打劫你的口袋,你却浑然不知的时代,今天的你不改变自己的思维,你一定被移动互联网思维所改变.先后排列不同,价值

Android Volley完全解析(四),带你从源码的角度理解Volley

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/17656437 经过前三篇文章的学习,Volley的用法我们已经掌握的差不多了,但是对于Volley的工作原理,恐怕有很多朋友还不是很清楚.因此,本篇文章中我们就来一起阅读一下Volley的源码,将它的工作流程整体地梳理一遍.同时,这也是Volley系列的最后一篇文章了. 其实,Volley的官方文档中本身就附有了一张Volley的工作流程图,如下图所示. 多数朋友突然看到一张这样

grunt源码解析:整体运行机制&grunt-cli源码解析

前端的童鞋对grunt应该不陌生,前面也陆陆续续的写了几篇grunt入门的文章.本篇文章会更进一步,对grunt的源码进行分析.文章大体内容内容如下: grunt整体设计概览 grunt-cli源码分析 grunt-cli模块概览 grunt-cli源码分析 写在后面 grunt整体设计概览 grunt主要由三部分组成.其中,grunt-cli是本文的讲解重点 grunt-cli:命令行工具,调用本地安装的grunt来运行任务,全局安装. grunt:本地grunt,一般安装在项目根目录下.主要

极速彩源码搭建步骤 Java 开发者都应该知道的 5 个注解

自 JDK5 推出以来,注解已成为Java生态系统不可缺少的一部分.虽然开发者为Java框架(例如Spring的@Autowired)开发了无数的自定义注解,但编译器认可的一些注解非常重要. 在本文中,极速彩源码搭建bbs.yasewl.com我们将看到5个Java编译器支持的注解,并了解其期望用途.顺便,我们将探索其创建背后的基本原理,围绕其用途的一些特质,以及正确应用的一些例子.虽然其中有些注解比其他注解更为常见,但非初学Java开发人员都应该消化了解每个注解. 首先,我们将深入研究Java

[转]Android Volley完全解析(四),带你从源码的角度理解Volley

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/17656437 经过前三篇文章的学习,Volley的用法我们已经掌握的差不多了,但是对于Volley的工作原理,恐怕有很多朋友还不是很清楚.因此,本篇文章中我们就来一起阅读一下Volley的源码,将它的工作流程整体地梳理一遍.同时,这也是Volley系列的最后一篇文章了. 其实,Volley的官方文档中本身就附有了一张Volley的工作流程图,如下图所示. 多数朋友突然看到一张这样

几种java JSON解析库的评测单元测试及源码

迷信了很长时间的阿里,但今天突然做了一些json库的测试,结果大跌眼镜,评测 结果是,org.json库与org.simple.json库相差不多,在一个数量级,但是阿里fastjson. net.sf.json库和Gson速度最慢.或许已经有人想喷了,但我就是呈现一个测试结果, 欢迎来指导我理解的不足,或许阿里还有很多特殊的泛型的处理和类型转换我没有用 到,本帖的所要阐明的是处理字符串解析并取得对象的一些属性没有涉及泛型时的速 度评测. 评测结果如图: 源码如下: import junit.f