Rxjava学习笔记(三)

RxJava 三:RxJava 3 线程调度 目录 1.Scheduler类型 2.Scheduler线程控制接口: 3.Schedules线程自由切换 4.延伸:利用subscribeOn() 指定doOnSubscribe()执行线程 RxJava 默认事件的产生和消费都是在同一个线程的。也就是说,默认实现的只是一个同步的观察者模式,即:在哪个线程调用subscribe()(订阅),就在哪个线程生产事件;在哪个线程生产事件,就在哪个线程消费事件,此时数据发送和数据接收是一一对应的,即发送一个,接收一个,再发送一个,再接收一个……。如... 阅读详情

变换操作符号

需求是:当我们的操作是当注册成功后去登录的连贯过程

Map操作符

Map操作是用来转换结果的方式


Observable.create(new ObservableOnSubscribe<Integer>(){
            @Override
            public void subscribe(ObservableEmitter<Integer> e) throws Exception {

                Log.d(TAG,"emitt:" + Thread.currentThread().getName());
                e.onNext(1);
            }
        }).subscribeOn(Schedulers.io())
                .map(new Function<Integer, String>() {
                    @Override
                    public String apply(Integer integer) throws Exception {
                        Log.d(TAG,"map:"+Thread.currentThread().getName());
                        return "This is "+ integer;
                    }
                })
                .observeOn(Schedulers.newThread())
                .subscribe(new Consumer<String>() {
                    @Override
                    public void accept(String s) throws Exception {
                        Log.d(TAG,"consumer:"+Thread.currentThread().getName());
                    }
        });
//运行结果

03-15 15:29:44.750 6275-6343/com.example.uds.recyclerviewtest D/MAP: emitt:RxCachedThreadScheduler-1
03-15 15:29:44.750 6275-6343/com.example.uds.recyclerviewtest D/MAP: map:RxCachedThreadScheduler-1
03-15 15:29:44.752 6275-6344/com.example.uds.recyclerviewtest D/MAP: consumer:RxNewThreadScheduler-1

注意顺序


      Observable.create(new ObservableOnSubscribe<Integer>(){
            @Override
            public void subscribe(ObservableEmitter<Integer> e) throws Exception {

                Log.d(TAG,"emitt:" + Thread.currentThread().getName());
                e.onNext(1);
            }
        }).subscribeOn(Schedulers.io())
                .observeOn(Schedulers.newThread())
                .map(new Function<Integer, String>() {
                    @Override
                    public String apply(Integer integer) throws Exception {
                        Log.d(TAG,"map:"+Thread.currentThread().getName());
                        return "This is "+ integer;
                    }
                })
                .subscribe(new Consumer<String>() {
                    @Override
                    public void accept(String s) throws Exception {
                        Log.d(TAG,"consumer:"+Thread.currentThread().getName());
                    }
        });


//运行结果

03-15 15:31:36.752 7944-8043/com.example.uds.recyclerviewtest D/MAP: emitt:RxCachedThreadScheduler-1
03-15 15:31:36.758 7944-8044/com.example.uds.recyclerviewtest D/MAP: map:RxNewThreadScheduler-1
03-15 15:31:36.758 7944-8044/com.example.uds.recyclerviewtest D/MAP: consumer:RxNewThreadScheduler-1


调换了map的所处的位置

当map在subscribeOn的后面,map执行是在和上游线程一个线程中
当map在observeOn的后面,map执行是在和下有线程一个线程中

上述中的 Map 我们是将Integer 转换为了 String 类型的结果

FlatMap

FlatMap 将一个发送事件的上游 Observable 变换为多个发送事件的 Observables,然后将他们发射的事件合并后放进一个单独的Observable中

FlatMap 不保证事件的顺序


        Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(ObservableEmitter<Integer> e) throws Exception {
                e.onNext(1);
                e.onNext(2);
                e.onNext(3);
            }
        }).flatMap(new Function<Integer, ObservableSource<String>>() {

            @Override
            public ObservableSource<String> apply(Integer integer) throws Exception {
                final List<String> list = new ArrayList<String>();
                for(int i=0;i<3;i++){
                    list.add("I am value "+integer);
                }
                return Observable.fromIterable(list).delay(100, TimeUnit.MILLISECONDS);
            }
        }).subscribe(new Consumer<String>() {
            @Override
            public void accept(String s) throws Exception {
                Log.d(TAG,s);
            }
        });


//运行结果

03-19 13:25:47.040 4531-4597/com.example.uds.recyclerviewtest D/MAP: I am value 1
03-19 13:25:47.040 4531-4597/com.example.uds.recyclerviewtest D/MAP: I am value 1
03-19 13:25:47.041 4531-4598/com.example.uds.recyclerviewtest D/MAP: I am value 2
03-19 13:25:47.041 4531-4598/com.example.uds.recyclerviewtest D/MAP: I am value 2
03-19 13:25:47.041 4531-4598/com.example.uds.recyclerviewtest D/MAP: I am value 2
03-19 13:25:47.042 4531-4597/com.example.uds.recyclerviewtest D/MAP: I am value 1
03-19 13:25:47.043 4531-4597/com.example.uds.recyclerviewtest D/MAP: I am value 3
03-19 13:25:47.043 4531-4597/com.example.uds.recyclerviewtest D/MAP: I am value 3
03-19 13:25:47.043 4531-4597/com.example.uds.recyclerviewtest D/MAP: I am value 3

Observable.fromIterable(list) 会将list中的每一个item都经过onNext发送出去

concatMap

concatMap 的效果和 flatMap的效果几乎是一样的,不过 concatMap 是严格按照顺序执行的

注册后登陆的代码示例



public interface API {

    @POST("product/detail.do")
    @FormUrlEncoded
    Observable<Product> getDetails(@Field("productId") Integer productId);


    @POST("user/login.do")
    @FormUrlEncoded
    Observable<ResponseBody> login(@Field("username") String username,@Field("password") String password);

    @POST("product/upload.do")
    @Multipart
    Observable<ResponseBody> uploadFile(@Part MultipartBody.Part upload_file);


}


        final HttpUrl loginUrl = HttpUrl.parse("http://192.168.125.120:8080/manage/user/login.do");
        OkHttpClient client = new OkHttpClient.Builder()
                .cookieJar(new CookieJar() {
                    private final HashMap<HttpUrl,List<Cookie>> cookieStore = new HashMap<HttpUrl, List<Cookie>>();
                    @Override
                    public void saveFromResponse(HttpUrl url, List<Cookie> cookies) {
                        cookieStore.put(url,cookies);
                    }

                    @Override
                    public List<Cookie> loadForRequest(HttpUrl url) {
                        List<Cookie> cookieList = cookieStore.get(loginUrl);
                       return cookieList != null ? cookieList : new ArrayList<Cookie>();
                    }
                }).build();

        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("http://192.168.125.120:8080/manage/")
                .client(client)
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .build();

        final API api = retrofit.create(API.class);

        api.login("admin","admin")
                .subscribeOn(Schedulers.io())//io线程中处理请求
                .observeOn(AndroidSchedulers.mainThread())//主线程中处理结果
                .doOnNext(new Consumer<ResponseBody>() {
                    @Override
                    public void accept(ResponseBody responseBody) throws Exception {
                        //可以在主线程根据相应结果做一些处理

                        //比如登陆成功 或者失败怎么处理 
                    }
                })
                .observeOn(Schedulers.io())//切换到io线程中发起查询数据的网络请求
                .flatMap(new Function<ResponseBody, ObservableSource<Product>>() {
                    @Override
                    public ObservableSource<Product> apply(ResponseBody responseBody) throws Exception {

                        return api.getDetails(26);
                    }
                }).observeOn(AndroidSchedulers.mainThread())//回到主线程中处理结果
                .subscribe(new Consumer<Product>() {
                    @Override
                    public void accept(Product product) throws Exception {
                        Log.d(TAG,product.toString());
                    }
                });



RxJava的简单学习(学习自扔物线) 首先说明下面这个是看扔物线大大的学习笔记,请直接前往 这里看极其详细的入门版这里先给出这个歌开源库的github地址前言当前RxJava可是越来越火,也越来越多的人开始学习RxJava,越来越多的项目开始使用RxJava,那么我们就有必要来学习下RxJava。RxJava是什么Rx是什么RX(Reactive Extensions)原来是由微软提出的一个综合了异步和机遇事件驱动的库包,使用开观察序 阅读详情

相关推荐

IEEE Transactions on Industrial Informatics(TII)投稿全流程解析:从准备到成功提交

本文详细解析了向IEEE Transactions on Industrial Informatics(TII)投稿的全流程,涵盖从投稿前的格式准备、内容结构优化到在线提交系统实操等关键环节。重点强调了遵守TII严格的格式规范、双盲评审要求以及如何构建有说服力的学术叙述,旨在帮助研究者提升稿件质量,顺利通过评审。

weixin_28396629的博客 1864

Observable的创建

https://www.jianshu.com/p/6e9b50899522 创建Obseravble 该章节展示创建响应源的函数,例如Obseravble. Outline create defer empty error from interval just never range timer Just Available in: Flowable,Obser...

lppl010_的专栏 1041

基于大疆TSDK与Pix4D的热红外数据工程化处理:从RJPG到温度正射影像的完整工作流

本文详细介绍了基于大疆TSDK与Pix4D的热红外数据工程化处理完整工作流。通过Python脚本自动化解析RJPG格式的热红外图像,提取并转换其中的原始辐射数据为包含真实温度信息的TIFF文件,再结合Pix4Dmapper进行批量拼接,最终生成可直接用于GIS分析的温度正射影像图。该流程解决了手动处理效率低下、参数校准复杂等难题,实现了从原始数据到定量分析成果的高效、准确、可重复生产。

weixin_29161785的博客 377

RxJava常用操作符 Observable.fromIterable

import io.reactivex.Observable val bannerItemData: ArrayList<HomeBean.Issue.Item> = mData.take(bannerItemSize).toCollection(ArrayList()) val bannerFeedList = ArrayList<Str...

u012922981的专栏 5098

Spring Boot 3.5.4 + LangChain4j实战:用Milvus搭建企业级RAG问答系统(附阿里百炼API配置)

本文详细介绍了如何利用Spring Boot 3.5.4、LangChain4j与Milvus构建企业级RAG问答系统。内容涵盖从架构设计、阿里百炼API安全配置、Milvus部署优化,到RAG检索、会话管理等核心实现,并提供了生产级API设计、监控集成及性能优化等实战经验,旨在帮助开发者打造高可用、可维护的Java AI应用。

weixin_29054399的博客 610

SQL Prompt 9.0插件突然无法使用解决办法(附防联网激活)多图+文字

可能由于Redgate公司最近抓盗版抓得严,导致激活后的SQL Prompt联网后突然无法使用,无论卸载重装都没办法继续使用,本人同时使用SQL Assistant和SQL Prompt,我喜欢SQL Assistant代码提示功能,而SQL Prompt我喜欢将查询结果复制后可以直接生产插入脚本,这是最爽的一件事,即便对表有多么熟悉,没有这些插件,几行语法都要敲大半天,目前本人已经离不开这两个插...

骚团长的博客 1万+

Android-学习笔记-RxJava操作符

1 创建操作 just() — 将一个或多个对象转换成发射这个或这些对象的一个Observable fromArray(), fromFuture(),fromIterable(), — 将一个数组, 一个Future, 或者一个Iterable转换成一个Observable create() — 使用一个函数从头创建一个Observable defer() —只有当订阅者订阅才创...

zuochunsheng的博客 681

别再瞎调了!STM32 Systick延时函数避坑指南(正点原子、野火、慧净代码对比)

本文深入解析STM32 Systick延时函数的实现差异与优化策略,对比正点原子、野火、慧净等主流方案的优缺点。针对us和ms级延时精度问题,提供避坑指南和高级优化技巧,帮助开发者根据项目需求选择最佳方案,提升嵌入式系统的定时控制精度。

weixin_28717807的博客 340

Rxjava转换函数

(1)map函数 通过对每个项目应用函数来转换Observable发出的项目 package rxjava.map; import io.reactivex.Observable; public class RxjavaMap { public static void main(String[] args) { Observable.range(1,5).map(m->{ return m*10; }).subsc.

红豆和绿豆的博客 268

【新手必看】挖漏洞流程指南,黑客手把手教你挖漏洞月入过万!收藏这篇就够了!(附学习笔记)

【新手必看】挖漏洞流程指南,黑客手把手教你挖漏洞月入过万!收藏这篇就够了!(附学习笔记)【新手必看】挖漏洞流程指南,黑客手把手教你挖漏洞月入过万!收藏这篇就够了!(附学习笔记)

weixin_57514792的博客 1105

HFSS螺旋线圈的优化设计与高效仿真实践

本文详细介绍了HFSS螺旋线圈的优化设计与高效仿真实践,涵盖核心参数设置、参数化建模、仿真加速技巧及结果分析。通过HFSS软件实现螺旋线圈的高效仿真,特别适用于无线充电和RFID系统设计,提升设计效率与性能验证准确性。

weixin_30235225的博客 445

RxJava 操作符

在 RxJava 中,一个实现了 observer 接口的对象可以订阅 observable 类的实例。订阅者对 observable 发射的任何数据或者数据序列做出响应。这种模式简化了并发操作,因为它不需要阻塞等待 observable 发射数据,而是创建了一个处于待命状态的观察者哨兵,哨兵在未来某个时刻响应 observable 的通知。RxJava 提供了一套异步编程的 API ,并且支持链式调用,所以使用 RxJava 编写的代码的逻辑会非常简洁。

u010498248的博客 785

(持续更新中!)详解【计算机类&面试真题】军队文职考试 ——第二期(真题+解析)| 网络协议的三个核心要素;交互式系统中的非剥夺策略;中断和陷入的区别;可变分区管理中的硬件机制;数据库系统的优点

本篇博客将讨论军队文职面试(计算机类)的几个关键问题。我们将介绍网络协议的核心要素(帮助你理解网络通信的基本原理)、交互式系统中的非剥夺策略(解释为何这是一个优秀的策略以及其对用户体验、系统稳定性和可预测性的影响)、中断和陷入的区别(从引起原因、处理机制、权限级别和应用等方面进行阐述)、可变分区管理的硬件机制以及数据库系统与文件系统的优点比较。通过阅读本文,您将深入了解这些话题,为面试准备和实际应用提供有价值的知识。

追光者♂:记录、分享、总结、提升,现象级专栏《Python从入门到人工智能》作者,无惧黑暗,坚信曙光 1707

RxJava 学习笔记(三)

我只是搬运工,本来想自己写,但是理解和语言表达真心过不了关, 源码方面,我详细点介绍, 笔记么,好东西我就抄 给 Android 开发者的 RxJava 详解线程控制Scheduler1)Scheduler的API在不指定线程的情况下, RxJava 遵循的是线程不变的原则,即:在哪个线程调用 subscribe(),就在哪个线程生产事件;在哪个线程生产事件,就在哪个线程消费事件。如果需要切换线

ZekingLee 961

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Rxjava2.0学习笔记(三)

吐槽 最近早上起来好困啊啊啊,特别特别想睡觉,早上起来还是看书吧,实在不行看看慕课网上免费的学习视频,感觉上面还是蛮不错的。 参考的大佬博客的链接 Rxjava2.0里面的水缸 在上一篇里面讲的两个上游一起发数据的时候,如果两个上游线程一样的话,就会发现,第一关上游先发完,然后第二个线程才继续发送,当时我们解决的问题的方式就是开两个线程,就好了。 如果其中一个水管A发送事件特别快, 而另...

sakurakider的博客 346

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

RxJava学习笔记(三)自定义操作符

RxJava学习笔记(三)自定义操作符概述这一章介绍Rxjava如何自定义操作符。首先要明白的是我们为什么要自定义操作符? rxjava提供的操作符无法解决问题 为了保证rxjava的链式调用规则 秉着钻研精神 如果你的操作符是被用于创造一个Observable,而不是变换或者响应一个Observable,使用 create( ) 方法,不要试图手动实现 Observable。另外,你可以按照下面的

moxiouhao的专栏 486

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

RxJava 学习笔记<三> Lifetime management

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33795743的博客 112

RxJava学习笔记(三)--- 线程调度Scheduler

线程调度在 RxJava 的默认规则中,事件的发出和消费都是在同一个线程的。也就是说,如果只用上面的方法,实现出来的只是一个同步的观察者模式。观察者模式本身的目的就是『后台处理,前台回调』的异步机制,因此异步对于 RxJava 是至关重要的。而要实现异步,则需要用到 RxJava 的另一个概念: Scheduler在不指定线程的情况下, RxJava 遵循的是线程不变的原则,即:在哪个线程调用 su

siguoyi的博客 3297

RxJava学习笔记、思维导图

前言 什么是RxJava? RxJava – Reactive Extensions for the JVM – a library for composing asynchronous and event-based programs using observable sequences for the Java VM. 这是github地址的解释,RxJava是使用观察者队列的异步事件流链...

王智博 499

理解RxJava:(三)RxJava的优点

理解RxJava:(三)RxJava的优点 在第一部分,讲解了RxJava的基本结构。在第二部分,展示了operators的强大之处。但是你们可能仍然没有被说服,也没有足够的理由信服。下面是一些能让你信服的RxJava框架的优点。 错误处理 截至当前,我们一直都忽略onComplete()和onError()方法。它们标志着Observable停止发出items以及原因(不管是成功地完...

didingyun4257的博客 627

Android RxJava使用介绍(三) RxJava的操作符

上一篇文章已经详细讲解了RxJava的创建型操作符,本片文章将继续讲解RxJava操作符,包括: Transforming Observables(Observable的转换操作符) Filtering Observables(Observable的过滤操作符)

呼啸而过的专栏 2万+

Rxjava的学习笔记

Rxjava的学习笔记RxJava到底是什么? 异步(观察者模式的本质是同步的但Rxjava可以通过线程间的切换和通信可以实现异步)

rookie_small的博客 527

【Android】写给小白的RxJava教程(三)

简介:大三学生党一枚!主攻Android开发,乐于交友一起学习! 个人语录:取乎其上,得乎其中,取乎其中,得乎其下,以顶级态度写好一篇的博客。 RxJava教程(三)一.RxJava中的创建操作符1.1 create1.2 just1.3 interval1.4 range1.5 timer2.1 map2.2 flatMap2.3 concatMap2.4 flatMapIterable2.5 buffer三.总结 一.RxJava中的创建操作符 什么是创建操作符?简而言之,就是会返回一个Observab

weixin_43927892的博客 1773

RxJava学习笔记

RxJava学习 RxJava学习笔记 是什么 异步 比喻: 就好比警察和小偷,警察是观察者,小偷是被观察者,小偷实行偷窃的行为就是事件,警察给小偷进行了改造,导致小偷在偷窃的时候就会通知警察过来抓捕 优点 简洁 四大组件 observable,被观察者 observer观察者,subscriber观察者 subscribe,订阅操作 onNext,onError,onComplete,也就是事...

空之境界 341

RxJava学习笔记---简单使用

RxJava是什么 Rx是什么 Rx全称Reactive Extensions,译为响应式拓展。 微软最先提出这个概念,借用MSDN上的定义:Reactive Extensions(Rx)是一个类库,它集成了异步、基于可观察(observable)序列的事件驱动编程和LINQ-style的查询操作,使用Rx,开发人员 可以用observable对象描述异步数据流 使用LINQ操作符异

我早就想,要这样载着你,翻山越岭 3956

RxJava 学习笔记

扔物线文章 《给 Android 开发者的 RxJava 详解》 的学习笔记。 RxJava 介绍 Github 地址: https://github.com/ReactiveX/RxJava https://github.com/ReactiveX/RxAndroid 引入依赖: compile ‘io.reactivex:rxjava:x.y.z’ compile ‘io.re

wblyuyang的专栏 1000
上一篇: Rxjava学习笔记(二)
下一篇: Rxjava学习笔记(四)
AINewBegin
博客等级 码龄12年 6粉丝 50原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值