因安卓中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事件流传递与线程切换的更多相关文章

  1. RxJava 操作符 on和doOn 线程切换 调度 Schedulers 线程池 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  2. RxJava学习;数据转换、线程切换;

    Observable(被观察者,发射器)发送数据: just:发送单个的数据: Observable.just("cui","chen","bo&qu ...

  3. RxJava事件流变换者--操作符

    对于Rxjava来说,操作符是它的一个非常重要的概念,如官网: 而上节上也贴了一下都有哪些操作符,其实还不少,所以有必要仔细学习一下关于操作符这块的东东,那操作符在Rxjava中扮演着什么样的角色呢, ...

  4. EventBus 消息的线程切换模型与实现原理

    一. 序 EventBus 是一个基于观察者模式的事件订阅/发布框架,利用 EventBus 可以在不同模块之间,实现低耦合的消息通信. EventBus 因为其使用简单且稳定,被广泛应用在一些生产项 ...

  5. 【追寻javascript高手之路05】理解事件流

    前言 新的一天又开始了,我们对今天对未来抱有很大期待,所以开始我们今天的学习吧,在此之前来点题外话,还是爱好问题. 周三的面试虽然失败,但是也是很有启迪的,比如之前我就从来没有想过爱好问题,我发现我的 ...

  6. 三言两语之js事件、事件流以及target、currentTarget、this那些事

    厉害了我的哥--你是如此简单我却将你给遗忘   放假前再看某文档,里边提到两个我既熟悉又陌生的概念target.currentTarget,说他熟悉我曾经看到过这两个事件对象的异同处,说他陌生吧?很不 ...

  7. OneAlert 入门(一)——事件流

    OneAlert 入门(一)--事件流 OneAlert 是国内首个 SaaS 模式的云告警平台,集成国内外主流监控/支撑系统,实现一个平台上集中处理所有 IT 事件,提升 IT 可靠性.它能以史上第 ...

  8. JS 事件冒泡整理 浏览器的事件流

    JavaScript与HTML的交互通过事件来实现.而浏览器的事件流是一个非常重要的概念.不去讨论那些古老的浏览器有事件捕获与事件冒泡的争议, 只需要知道在DOM2中规定的事件流包括了三个部分,事件捕 ...

  9. javascript 中 事件流和事件冒泡

    一.事件流 是描述页面接受事件的顺序,IE 使用的是时间冒泡流;而Netscape的事件采用的是事件捕获流.1.事件冒泡JS 和 HTML是通过事件的方式实现交互.事件冒泡 开始元素,将事件逐级传递, ...

  10. 【第二篇】学习 android 事件总线androidEventbus之异步事件的传递

    1,不同Activity直接发送Ansy的事件,以及其他任何事件,必须通过 postSticky方式来进行事件的传递,而不能通过post的形式来进行传递:EventBus.getDefault().p ...

随机推荐

  1. KubeSphere部署Nacos集群

    https://blog.csdn.net/RookiexiaoMu_a/article/details/120610006

  2. Avalonia跨平台入门第二十一篇之玩耍CEF

    在前面分享的几篇中咱已经玩耍了Popup.ListBox多选.Grid动态分.RadioButton模板.控件的拖放效果.控件的置顶和置底.控件的锁定.自定义Window样式.动画效果.Expande ...

  3. transformers库的使用【一】——pipeline的简单使用

    transformers库的使用使用pipeline API来快速使用一些预训练模型 使用预训练模型最简单的方法就是使用pipeline(),transformers提供了一些任务: 1.情感分析(S ...

  4. Renix_端口迁移及修改 IP 地址——网络测试仪实操

    ​1.端口迁移功能概述 端口迁移功能允许用户将一个端口的配置迁移到另一个物理端口上. 2.端口迁移步骤如下: 2.1打开端口迁移向导: 在导航树,右键点击端口或者一组端口,然后从右键菜单选择" ...

  5. System.gc() 与 Runtime.gc()的区别

    什么是 GC GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监 ...

  6. 神器!免费替代Postman

    今天给大家推荐一个神器 Hoppscotch,一个 完全免费 的 开源 API开发工具,用过的人都说好! 为什么选择 Hoppscotch?相信每个前端开发者都被 CORS 折磨过.Hoppscotc ...

  7. 飞桨第一的背后:打造“国之重器”,中国科技实力反超从AI开始

    中国科技核心技术的反超从AI开始 中国AI发展在全球处于什么样的地位,一直都有争议.有的说中国AI起步不晚,与美国处于同一起跑线,也有的说中国在一些技术上还有差距. 沙利文刚刚发布<中国深度学习 ...

  8. 【STM32系列】利用MATLAB配合ARM-DSP库设计IIR数字滤波器(保姆级教程)

    ps.源码放在最后面 设计FIR数字滤波器可以看这里:利用MATLAB配合ARM-DSP库设计FIR数字滤波器(保姆级教程) 设计IIR滤波器 MATLAB配置 设计步骤 首先在命令行窗口输入&quo ...

  9. 【光照】[PBR][法线分布]GGX实现方法对比

    [从UnityURP开始探索游戏渲染]专栏-直达 GGX的全称与基本概念 ‌GGX的全称‌:Ground Glass X (或 Generalized Trowbridge-Reitz Distrib ...

  10. 极速搞定国庆头像生成器:Qwen3-Coder 让AI当你的全栈搭档

    以前啊,咱们程序员为了追热点.抢风口,经常干一件事--熬夜爆肝,就为了赶在别人前面做出一款小产品.为啥?因为谁先上线,谁就能吃到第一波流量红利,用户一用觉得不错,说不定立马就付费了.这种"快 ...