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 ...
随机推荐
- KubeSphere部署Nacos集群
https://blog.csdn.net/RookiexiaoMu_a/article/details/120610006
- Avalonia跨平台入门第二十一篇之玩耍CEF
在前面分享的几篇中咱已经玩耍了Popup.ListBox多选.Grid动态分.RadioButton模板.控件的拖放效果.控件的置顶和置底.控件的锁定.自定义Window样式.动画效果.Expande ...
- transformers库的使用【一】——pipeline的简单使用
transformers库的使用使用pipeline API来快速使用一些预训练模型 使用预训练模型最简单的方法就是使用pipeline(),transformers提供了一些任务: 1.情感分析(S ...
- Renix_端口迁移及修改 IP 地址——网络测试仪实操
1.端口迁移功能概述 端口迁移功能允许用户将一个端口的配置迁移到另一个物理端口上. 2.端口迁移步骤如下: 2.1打开端口迁移向导: 在导航树,右键点击端口或者一组端口,然后从右键菜单选择" ...
- System.gc() 与 Runtime.gc()的区别
什么是 GC GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监 ...
- 神器!免费替代Postman
今天给大家推荐一个神器 Hoppscotch,一个 完全免费 的 开源 API开发工具,用过的人都说好! 为什么选择 Hoppscotch?相信每个前端开发者都被 CORS 折磨过.Hoppscotc ...
- 飞桨第一的背后:打造“国之重器”,中国科技实力反超从AI开始
中国科技核心技术的反超从AI开始 中国AI发展在全球处于什么样的地位,一直都有争议.有的说中国AI起步不晚,与美国处于同一起跑线,也有的说中国在一些技术上还有差距. 沙利文刚刚发布<中国深度学习 ...
- 【STM32系列】利用MATLAB配合ARM-DSP库设计IIR数字滤波器(保姆级教程)
ps.源码放在最后面 设计FIR数字滤波器可以看这里:利用MATLAB配合ARM-DSP库设计FIR数字滤波器(保姆级教程) 设计IIR滤波器 MATLAB配置 设计步骤 首先在命令行窗口输入&quo ...
- 【光照】[PBR][法线分布]GGX实现方法对比
[从UnityURP开始探索游戏渲染]专栏-直达 GGX的全称与基本概念 GGX的全称:Ground Glass X (或 Generalized Trowbridge-Reitz Distrib ...
- 极速搞定国庆头像生成器:Qwen3-Coder 让AI当你的全栈搭档
以前啊,咱们程序员为了追热点.抢风口,经常干一件事--熬夜爆肝,就为了赶在别人前面做出一款小产品.为啥?因为谁先上线,谁就能吃到第一波流量红利,用户一用觉得不错,说不定立马就付费了.这种"快 ...