RxJava事件流传递与线程切换
因安卓中UI操作只能在安卓主线程进行,而网络数据传输又不能在主线程进行,所以可以使用RxJava来实现。
RxAndroid等原理类似。
代码:
Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(ObservableEmitter<String> emitter) throws Exception {
String s = "oh yeah...";
//执行耗时任务
emitter.onNext(s);
}
}).map(new Function<String, Integer>() {
@Override
public Integer apply(String s) throws Exception {
return Integer.parseInt(s);
}
}).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<Integer>(){
@Override
public void onNext(Integer i) {
//订阅者操作,UI操作
}
});
摘一张大概流程图:

图中描绘了RxJava中重要的三条流:构建流、订阅流、响应流
构建流:从source到observer,每个节点都会生成对应的observable(ObservableOnSubsribe等,根据不同功能重写subscribeActual方法)
订阅流:当调用最后一个subscribe时,从observer往source依次订阅,每个节点的订阅其实是对上游订阅者(从右往左)的不同功能的封装,比如map对数据进行处理映射、subscribeOn对下游执行线程(往source方向)的切换(通过提交SubscribeTask)、observeOn包装上游observer向下订阅
响应流:通过create创建生成ObservableCreate,看看简要源码:
public final class ObservableCreate<T> extends Observable<T> {
final ObservableOnSubscribe<T> source;
public ObservableCreate(ObservableOnSubscribe<T> source) {
this.source = source;
}
@Override
protected void subscribeActual(Observer<? super T> observer) {
CreateEmitter<T> parent = new CreateEmitter<T>(observer);
//先执行我们手动创建的事件源的onSubscribe,然后把emitter传递给事件源的subscribe
observer.onSubscribe(parent);
//事件源的subscribe中处理耗时任务后调用parent即emitter的onNext往后传递
source.subscribe(parent);
}
}
再看看CreateEmitter:
static final class CreateEmitter<T> extends AtomicReference<Disposable>
implements ObservableEmitter<T>, Disposable { final Observer<? super T> observer; CreateEmitter(Observer<? super T> observer) {
this.observer = observer;
}
@Override
public void onNext(T t) {
if (!isDisposed()) {
observer.onNext(t);
}
}
//省略
}
可以看出响应流从我们写的事件源的subscribe处发生转向,开始向下游响应数据,observeOn操作符生成的observableOnSubscribe由重写subscribe产生一个包装observer,将下游observer的onNext包装到异步任务执行
先写到这,以后用到再补充
RxJava事件流传递与线程切换的更多相关文章
- RxJava 操作符 on和doOn 线程切换 调度 Schedulers 线程池 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- RxJava学习;数据转换、线程切换;
Observable(被观察者,发射器)发送数据: just:发送单个的数据: Observable.just("cui","chen","bo&qu ...
- RxJava事件流变换者--操作符
对于Rxjava来说,操作符是它的一个非常重要的概念,如官网: 而上节上也贴了一下都有哪些操作符,其实还不少,所以有必要仔细学习一下关于操作符这块的东东,那操作符在Rxjava中扮演着什么样的角色呢, ...
- EventBus 消息的线程切换模型与实现原理
一. 序 EventBus 是一个基于观察者模式的事件订阅/发布框架,利用 EventBus 可以在不同模块之间,实现低耦合的消息通信. EventBus 因为其使用简单且稳定,被广泛应用在一些生产项 ...
- 【追寻javascript高手之路05】理解事件流
前言 新的一天又开始了,我们对今天对未来抱有很大期待,所以开始我们今天的学习吧,在此之前来点题外话,还是爱好问题. 周三的面试虽然失败,但是也是很有启迪的,比如之前我就从来没有想过爱好问题,我发现我的 ...
- 三言两语之js事件、事件流以及target、currentTarget、this那些事
厉害了我的哥--你是如此简单我却将你给遗忘 放假前再看某文档,里边提到两个我既熟悉又陌生的概念target.currentTarget,说他熟悉我曾经看到过这两个事件对象的异同处,说他陌生吧?很不 ...
- OneAlert 入门(一)——事件流
OneAlert 入门(一)--事件流 OneAlert 是国内首个 SaaS 模式的云告警平台,集成国内外主流监控/支撑系统,实现一个平台上集中处理所有 IT 事件,提升 IT 可靠性.它能以史上第 ...
- JS 事件冒泡整理 浏览器的事件流
JavaScript与HTML的交互通过事件来实现.而浏览器的事件流是一个非常重要的概念.不去讨论那些古老的浏览器有事件捕获与事件冒泡的争议, 只需要知道在DOM2中规定的事件流包括了三个部分,事件捕 ...
- javascript 中 事件流和事件冒泡
一.事件流 是描述页面接受事件的顺序,IE 使用的是时间冒泡流;而Netscape的事件采用的是事件捕获流.1.事件冒泡JS 和 HTML是通过事件的方式实现交互.事件冒泡 开始元素,将事件逐级传递, ...
- 【第二篇】学习 android 事件总线androidEventbus之异步事件的传递
1,不同Activity直接发送Ansy的事件,以及其他任何事件,必须通过 postSticky方式来进行事件的传递,而不能通过post的形式来进行传递:EventBus.getDefault().p ...
随机推荐
- MyBatis ORM概念和原理(三)
ORM 概念 我们在介绍 MyBatis 时说到,MyBatis是一种半自动 ORM 实现.那何为 ORM,何为半自动? ORM(Object/Relation Mapping,对象/关系数据库映射) ...
- What is CSP (内容安全策略)?
目录 它是如何保证安全的? 如何实施 CSP? 安全测试者如何绕过 CSP? 只能辅助,不可做主力 内容安全策略(CSP) 内容安全策略(Content Security Policy, CSP) 是 ...
- linux查看系统编码/语言和修改系统编码/语言的方法
linux查看系统编码/语言和修改系统编码/语言的方法 分类专栏: Linux 文章标签: linux查看修改系统编码 linux查看系统编码 Linux1.查看字符编码和语言使用locale命令,语 ...
- 基于FPGA的74ls148设计
1 74ls148简介 74ls148是8线-3线优先编码器,将 8 条数据线(0-7)进行 3 线(4-2-1)二进制(八进制)优先编码,即对最高位数据线进行译码.利用选通端(EI)和输出选通端(E ...
- 算法题:数组中的第k个最大元素
力扣链接 题意 给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素. 请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 你必须设计并实现时间复杂度为 ...
- centos7双网卡绑定bond
常用的有三种 mode=0:平衡负载模式,有自动备援,但需要"Switch"支援及设定. mode=1:自动备援模式,其中一条线若断线,其他线路将会自动备援. mode=6:平衡负 ...
- 纯电之王诞生:问界M8如何击穿40万级市场天花板
问界M8纯电版以35.98万元起售价悍然杀入40万级纯电市场,并且打破行业旧律实现纯电与增程的同价.延续问界M8增程版的爆款之势,上市2小时大定突破7000台. 爆款基因背后,是华为全栈技术与鸿蒙智行 ...
- C#/.NET/.NET Core技术前沿周刊 | 第 56 期(2025年9.22-9.28)
前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录.追踪C#/.NET/.NET Core领域.生态的每周最新.最实用.最有价值的技术文章.社区动态.优质项目和学习资源等. ...
- 基于OpenCV的摄像头采集印刷体数字识别
去年刚学完OpenCV练手的东西,用摄像头采集印刷体数字之后做模板匹配,识别出结果之后用串口发给下位机,能够实现基本功能,鲁棒性不是很好,角度不太正的时候会有比较严重的误识别 原则上来说代码应该做一下 ...
- [数据分析/BI] Microsoft Power BI 使用指南
1 概述:Power BI 什么是 Power BI? Power BI 是由微软发布的一款商业智能(BI)软件,或者说数据分析工具. Microsoft Power BI 是一个完整的报表解决方案, ...