RxJava學習記錄

文章目錄

  • 1. 總覽
    • 1.1 基本原理
    • 1.2 導入包和依賴
  • 2. 操作符
    • 2.1 創建操作符
    • 2.2 轉換操作符
    • 2.3 組合操作符
    • 2.4 功能操作符

1. 總覽

1.1 基本原理

在這里插入圖片描述
參考文獻
在這里插入圖片描述
構建流:每一步操作都會生成一個新的Observable節點(沒錯,包括ObserveOn和SubscribeOn線程變換操作),并將新生成的Observable返回,直到最后一步執行subscribe方法。編寫Rxjava代碼的過程其實就是構建一個一個Observable節點的過程
訂閱流:從最后一個N5節點的訂閱行為開始,依次執行前面各個節點真正的訂閱方法。在每個節點的訂閱方法中,都會生成一個新的Observer**,這個Observer會包含“下游”的Observer,這樣當每個節點都執行完訂閱(subscribeActual)后,也就生成了一串Observer,它們通過downstream,upstream引用連接
回調流: 當訂閱流執行到最后,也就是第一個節點N0時,用onNext方法,兩個作用,一個是把上個節點返回的數據進行一次map變換,另一個就是將map后的結果傳遞給下游。
小結:先從上到下把各個變換的Observable連成鏈(拼裝流水線),然后在最后subscribe的時候,又從下到上通過每個Observable的OnSubscribe從最下的Subscriber對象開始連成鏈(流水線開始工作包裝Subscriber),直到頂端,當頂端的Subscriber對象調用了onNext方法的時候,又從上往下調用Subscriber鏈的onNext(用戶一層層拆開包裝盒),里面執行了每個操作的變換邏輯。

1.2 導入包和依賴

implementation 'io.reactivex.rxjava2:rxjava:2.2.21'
implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'

2. 操作符

添加鏈接描述

2.1 創建操作符

  • Create
    private void test1() {//被觀察者Observable;觀察者Observer/消費者consumer;通過subsribe訂閱Observable.create(new ObservableOnSubscribe<Object>() {@Overridepublic void subscribe(ObservableEmitter<Object> emitter) throws Exception {emitter.onNext("1");
//                emitter.onError(new Throwable("異常模擬"));emitter.onComplete();}}).subscribe(new Observer<Object>() {@Overridepublic void onSubscribe(Disposable d) {System.out.println("subscribe");}@Overridepublic void onNext(Object o) {System.out.println("onNext Observer " + o);}@Overridepublic void onError(Throwable e) {System.out.println("erro");}@Overridepublic void onComplete() {System.out.println("Complete Observer....");}});}private void test2() {Disposable d = Observable.create(new ObservableOnSubscribe<Object>() {@Overridepublic void subscribe(ObservableEmitter<Object> emitter) throws Exception {emitter.onNext("2");emitter.onError(new Throwable("模擬異常"));emitter.onComplete();}}).subscribe(new Consumer<Object>() {@Overridepublic void accept(Object o) throws Exception {System.out.println("Accept " + o);}}, new Consumer<Throwable>() {@Overridepublic void accept(Throwable throwable) throws Exception {System.out.println("Accept " + throwable);}});}

Observer:
適合需要完整事件處理的場景,包括處理數據、錯誤和完成信號。
提供了更靈活的事件處理能力,可以根據需求實現對錯誤和完成事件的響應。
Consumer:
適合簡單的場景,只需處理每個發出的數據項,而不需要關心錯誤或完成事件。
簡化了代碼結構,特別是在處理簡單流時,使用起來更為便捷和直觀。

  • 其他
    just 10個發射源
    from 將一個Iterable、一個Future、 或者一個數組,內部通過代理的方式轉換成一個Observable
    interval操作符 創建一個按固定時間間隔發射整數序列的Observable,這個序列為一個無限遞增的整數序列
    range操作符 發射一個范圍內的有序整數序列,并且我們可以指定范圍的起始和長度
    repeat操作符 重復發射原始Observable的數據序列,這個序列或者是無限的,或者通過repeat(n)指定重復次數

2.2 轉換操作符

map
將源Observable發送的數據轉換為一個新的Observable對象

    private void test3(){Observable.just("111").map(new Function<String, Object>() {@Overridepublic Object apply(String s) throws Exception {return "my name is " + s;}}).subscribe(ob);}//subscribe
//onNext Observer my name is 111
//Complete Observer....

flatmap
添加鏈接描述
在這里插入圖片描述
將一個發送事件的上游Observable變換為多個發送事件的Observables,然后將它們發射的事件合并后放進一個單獨的Observable里(但是是無序的)

    private void test4(){Disposable ob = Observable.create(new ObservableOnSubscribe<Integer>() {@Overridepublic void subscribe(ObservableEmitter<Integer> emitter) throws Exception {emitter.onNext(1);emitter.onNext(2);emitter.onNext(3);}}).flatMap(new Function<Integer, ObservableSource<String>>() {@Overridepublic ObservableSource<String> apply(Integer o) throws Exception {final List<String> list = new ArrayList<>();for (int i = 0; i < 3; i++) {list.add("I am value " + o);}return Observable.fromIterable(list).delay(10, TimeUnit.MILLISECONDS);//為了無序 加了延遲}}).subscribe(new Consumer<String>() {@Overridepublic void accept(String o) throws Exception {System.out.println(o);}});}//出現的 1 2 3會隨機出現

concatMap
concatMap操作符類似于flatMap操作符,不同的一點是它按次序連接。

2.3 組合操作符

concat
concatArray
合并多個對象,按照一定的順序
在這里插入圖片描述
merge
在這里插入圖片描述

2.4 功能操作符

SubscribeOn 改變調用它之前代碼的線程,只有第一次有效
ObserveOn 改變調用它之后代碼的線程, 可以多次調用

        Observable.create(new ObservableOnSubscribe<Object>() {@Overridepublic void subscribe(ObservableEmitter<Object> emitter) throws Exception {Log.d(TAG,"加了subscribeOn和observeOn: " + Thread.currentThread().getName());emitter.onNext("1111");emitter.onNext("22222");emitter.onComplete();}}).subscribeOn(Schedulers.newThread()) //1 進行創建和發射在子線程.observeOn(AndroidSchedulers.mainThread())// 2 在主線程消費;由于程序是test里面執行,所以不是main線程;后續改成了main是一樣的道理.subscribe(new Observer<Object>() {@Overridepublic void onSubscribe(Disposable d) {Log.d(TAG,"onSubscribe " + Thread.currentThread().getName());}@Overridepublic void onNext(Object o) {Log.d(TAG,"onNext " + Thread.currentThread().getName());}@Overridepublic void onError(Throwable e) {Log.d(TAG,"onError " + Thread.currentThread().getName());}@Overridepublic void onComplete() {Log.d(TAG,"onComplete " + Thread.currentThread().getName());}});}

在這里插入圖片描述

在這里插入圖片描述
在這里插入圖片描述
這一個onSubsribe 一直是在測試線程里


1. **Observable 的創建和訂閱**:- 在 `subscribe()` 方法中,你創建了一個 `Observer` 對象,并將其訂閱到了 `Observable` 對象上。2. **onSubscribe 方法執行**:- 當 `subscribe()` 方法被調用后,`Observer` 對象的 `onSubscribe` 方法會立即執行。這是因為 `onSubscribe` 是 `Observer` 接口的一部分,它負責接收 `Disposable` 對象,表示訂閱關系,而不是響應數據流本身。3. **異步操作執行**:- 然后,`Observable` 中的異步操作開始執行。在你的例子中,通過 `Observable.create()` 創建了一個新的數據流,該數據流會在新線程(通過 `subscribeOn(Schedulers.newThread())` 指定的線程)中執行。這意味著 `Observable.create()` 中的代碼塊會在新線程中運行,而不會阻塞主線程。4. **數據流發射和消費**:- 在新線程中,`ObservableEmitter` 會發射數據項(通過 `emitter.onNext()` 發送數據)并在合適的時機調用 `onComplete()` 或者 `onError()`,表示數據流的結束。5. **observeOn 切換到主線程**:- 通過 `observeOn(AndroidSchedulers.mainThread())`,確保在數據流中的消費者部分(即 `Observer` 的 `onNext()`, `onError()`, `onComplete()` 方法)在主線程中執行。這個切換保證了在主線程更新UI或處理數據,從而避免了在主線程中執行耗時操作而導致的UI阻塞問題。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/42172.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/42172.shtml
英文地址,請注明出處:http://en.pswp.cn/web/42172.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

asp.netWebForm(.netFramework) CSRF漏洞

asp.netWebForm(.netFramework) CSRF漏洞 CSRF&#xff08;Cross-Site Request Forgery&#xff09;跨站請求偽造是一種常見的 Web 應用程序安全漏 洞&#xff0c;攻擊者通過誘使已認證用戶在受信任的網站上執行惡意操作&#xff0c;從而利用用戶的身份 執行未經授權的操作。攻…

echarts實現3D餅圖

先看下最終效果 實現思路 使用echarts-gl的曲面圖&#xff08;surface&#xff09;類型 通過parametric繪制曲面參數實現3D效果 代碼實現 <template><div id"surfacePie"></div> </template> <script setup>import {onMounted} fro…

簡單的找到自己需要的flutter ui 模板

簡單的找到自己需要的flutter ui 模板 網站 https://flutterawesome.com/ 簡介 我原本以為會很難用 實際上不錯 很簡單 打開后界面類似于,右上角可以搜索 點擊view github 相當簡單 很oks

RabbitMq,通過prefetchCount限制消費并發數

1.問題:項目瓶頸,通過rabbitMq來異步上傳圖片,由于并發上傳的圖片過多導致阿里OSS異常, 解決方法:通過prefetchCount限制圖片上傳OSS的并發數量 2.定義消費者 Component AllArgsConstructor Slf4j public class ReceiveFaceImageEvent {private final UPloadService uploadSe…

【見刊通知】MVIPIT 2023機器視覺、圖像處理與影像技術國際會議

MVIPIT 2023&#xff1a;https://ieeexplore.ieee.org/xpl/conhome/10578343/proceeding 入庫Ei數據庫需等20-50天左右 第二屆會議征稿啟動&#xff08;MVIPIT 2024&#xff09; The 2nd International Conference on Machine Vision, Image Processing & Imaging Techn…

MacOS和Windows中怎么安裝Redis

希望文章能給到你啟發和靈感&#xff5e; 如果覺得文章對你有幫助的話&#xff0c;點贊 關注 收藏 支持一下博主吧&#xff5e; 閱讀指南 開篇說明一、基礎環境說明1.1 硬件環境1.2 軟件環境 二、MacOS中Redis的安裝2.1 HomeBrew 安裝&#xff08;推薦&#xff09;2.2 通過官方…

70.WEB滲透測試-信息收集- WAF、框架組件識別(10)

免責聲明&#xff1a;內容僅供學習參考&#xff0c;請合法利用知識&#xff0c;禁止進行違法犯罪活動&#xff01; 內容參考于&#xff1a; 易錦網校會員專享課 上一個內容&#xff1a;69.WEB滲透測試-信息收集- WAF、框架組件識別&#xff08;9&#xff09; 關于waf相應的識…

arcgis js 4.x實現類似openalayers加載tilewms圖層效果

一、普通wms與tilewms區別 相同點&#xff1a;都是加載WMS服務。 不同點&#xff1a;TitleWMS會把當前可視窗口根據網格&#xff08;開發者可以在調用OpenLayers api的時候自定義&#xff09;切分&#xff0c;一片一片地返回回來&#xff0c;在前端進行整合。而ImageWMS則不會…

Springboot 配置 log4j 時的注意事項

感謝博主 https://www.cnblogs.com/fishlittle/p/17950944 依賴 SpringBoot 的 starter 自帶的是 logback 日志&#xff0c;若要使用 log4j2 日志&#xff0c;需要引入對應依賴。logback 日志和 log4j2 日志都是對 slf4j 門面的實現&#xff0c;只能存在一個&#xff0c;且必…

江協科技51單片機學習- p25 無源蜂鳴器

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黃桃罐頭&#xff0c;希望你看完之后&#xff0c;能對你有所幫助&#xff0c;不足請指正&#xff01;共同學習交流 &#x1f381;歡迎各位→點贊&#x1f44d; 收藏?? 留言&#x1f4dd;?…

環信IM實現小米、oppo推送詳細步驟

本文教大家集成環信IM后如何實現小米、oppo推送。 一、小米推送 步驟一、在小米開放平臺創建應用。 在 小米開放平臺 創建應用&#xff0c;開啟推送服務。詳見小米官方網站的 推送服務接入指南。 步驟二、上傳推送證書。 注冊完成后&#xff0c;需要在環信即時通訊云控制臺…

WebSocket 雙向通信

WebSocket 是一種在前端開發中用于實現雙向通信的網絡技術。它與傳統的 HTTP 請求-響應模式不同&#xff0c;允許客戶端和服務器之間實時、雙向的數據傳輸。 1. 實時性 能夠實現數據的即時推送和接收&#xff0c;無需輪詢服務器&#xff0c;大大降低了延遲。 2. 雙向通信 客…

LeetCode-刷題記錄-前綴和合集(本篇blog會持續更新哦~)

一、前綴和&#xff08;Prefix Sum&#xff09;算法概述 前綴和算法通過預先計算數組的累加和&#xff0c;可以在常數時間內回答多個區間和相關的查詢問題&#xff0c;是解決子數組和問題中的重要工具。 它的基本思想是通過預先計算和存儲數組的前綴和&#xff0c;可以在 O(1)…

初步理解六__《面向互聯網大數據的威脅情報 并行挖掘技術研究 》

初步理解 六 STIX 提出了一種標準化的網絡威脅情報格式(Structured Threat Information eXpression, STIX) gtp STIX&#xff08;Structured Threat Information eXpression&#xff09;是一種用于標準化描述和共享網絡威脅情報的格式和語言。它的設計目標是提供一個通用的…

7.8作業

一、思維導圖 二、 1】按值修改 2】按值查找&#xff0c;返回當前節點的地址 &#xff08;先不考慮重復&#xff0c;如果有重復&#xff0c;返回第一個&#xff09; 3】反轉 4】銷毀鏈表 //按值修改 int value_change(linklistptr H,datatype e,int value) {if(HNULL||empty(H…

Greenplum(二)【SQL】

前言 Greenplum 的剩余部分主要其實主要就是 DDL 和之前學的 MySQL 不大一樣&#xff0c;畢竟 Greenplum 是基于 PostgreSQL 數據庫的&#xff0c;不過那些 DML 和 MySQL、Hive 基本上大差不差&#xff0c;所以就沒有必要浪費時間了。 1、DDL 1.1、庫操作 1.1.1、創建數據庫…

python爬蟲加入進度條

安裝tqdm和requests庫 pip install tqdm -i https://pypi.tuna.tsinghua.edu.cn/simplepip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple帶進度條下載 import time # 引入time模塊&#xff0c;用于處理時間相關的功能 from tqdm import * # 從tqdm包中…

算法力扣刷題 三十六【二叉樹迭代遍歷】

前言 記錄三十五 介紹了二叉樹基礎&#xff0c;和遞歸法模版及遍歷方式&#xff1b; 遞歸&#xff1a;代碼簡單&#xff0c;但要想清楚三步&#xff1a; 確定參數和返回值&#xff1b;確定終止條件&#xff0c;并return什么&#xff1f;&#xff1b;終止條件外的邏輯&#xf…

【AI大模型】賦能兒童安全:樓層與室內定位實踐與未來發展

文章目錄 引言第一章&#xff1a;AI與室內定位技術1.1 AI技術概述1.2 室內定位技術概述1.3 樓層定位的挑戰與解決方案 第二章&#xff1a;兒童定位與安全監控的需求2.1 兒童安全問題的現狀2.2 智能穿戴設備的興起 第三章&#xff1a;技術實現細節3.1 硬件設計與選擇傳感器選擇與…

SpringSecurity中文文檔(Servlet Authorization Architecture )

Authorization 在確定了用戶將如何進行身份驗證之后&#xff0c;還需要配置應用程序的授權規則。 Spring Security 中的高級授權功能是其受歡迎的最有說服力的原因之一。無論您選擇如何進行身份驗證(無論是使用 Spring Security 提供的機制和提供者&#xff0c;還是與容器或其…