RxJava基本使用

来源:https://www.cnblogs.com/tangZH/archive/2019/12/23/12088300.html
-Advertisement-
Play Games

更多文章請點擊鏈接:http://77blogs.com/?p=162 轉載請標明出處:https://www.cnblogs.com/tangZH/p/12088300.html,http://77blogs.com/?p=162 RxJava究竟是啥,從根本上來講,它就是一個實現非同步操作的庫,並 ...


更多文章請點擊鏈接http://77blogs.com/?p=162

轉載請標明出處https://www.cnblogs.com/tangZH/p/12088300.htmlhttp://77blogs.com/?p=162

 

RxJava究竟是啥,從根本上來講,它就是一個實現非同步操作的庫,並且能夠使代碼非常簡潔。它的非同步是使用觀察者模式來實現的。

關於觀察者模式的介紹,可以看我這一篇文章:

https://www.cnblogs.com/tangZH/p/11175120.html 

這裡我主要講RxJava的一些基本用法,基本案例,原理的話暫時不深究:

一、自己構造事件

 
Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(ObservableEmitter emitter) {
                int i = getNumber();
                if (i < 0) {
                    emitter.onComplete();
                    return;
                } else {
                    Log.d(TAG, Thread.currentThread().getName());
                    emitter.onNext(i);
                    emitter.onComplete();
                }
            }
        })
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Consumer<Integer>() {
                    @Override
                    public void accept(Integer integer) throws Exception {
                        Log.d(TAG, Thread.currentThread().getName());
                        Log.d(TAG, integer + "");
                    }
                }, new Consumer<Throwable>() {
                    @Override
                    public void accept(Throwable throwable) throws Exception {
 
                    }
                });

RxJava 有四個基本概念:Observable (可觀察者,即被觀察者)、 Observer (觀察者)、 subscribe (訂閱)、事件。Observable 和 Observer 通過 subscribe() 方法實現訂閱關係,從而 Observable 可以在需要的時候發出事件來通知 Observer

 

onNext():方法用來發送事件。

下麵看看其他兩個方法:

  • onCompleted(): 事件隊列完結。RxJava 不僅把每個事件單獨處理,還會把它們看做一個隊列。RxJava 規定,當不會再有新的 onNext() 發出時,需要觸發 onCompleted() 方法作為標誌。
  • onError(): 事件隊列異常。在事件處理過程中出異常時,onError() 會被觸發,同時隊列自動終止,不允許再有事件發出。
  • 在一個正確運行的事件序列中, onCompleted() 和 onError() 有且只有一個,並且是事件序列中的最後一個。需要註意的是,onCompleted() 和 onError() 二者也是互斥的,即在隊列中調用了其中一個,就不應該再調用另一個。

講一下我們上面的例子,上面這個例子是採用簡潔的鏈式調用來寫的:

首先使用 create() 方法來創建一個 Observable ,併為它定義事件觸發規則,然後通過emitter.onNext(i)傳遞出來,.subscribeOn(Schedulers.io())便是指定該事件產生的所在的線程為子線程,.observeOn(AndroidSchedulers.mainThread())指定觀察者執行的線程為主線程。這時候為止返回的對象為Observable對象。

然後該Observable對象subscribe綁定觀察者(也就是觀察者進行訂閱),裡面有接收被觀察者發出來的事件,有一個成功的方法,和一個失敗的方法,這樣就實現了由被觀察者向觀察傳遞事件。

 

二、對集合里的數據進行變換

        List<Integer> list = new ArrayList<Integer>() {
            {
                add(0);
                add(1);
                add(2);
            }
        };
        Observable.fromIterable(list).map(new Function() {
            @Override
            public Object apply(Object o) throws Exception {
                int i = (int) o + 1;
                return String.valueOf(i);
            }
        })
                .toList()
                .toObservable().subscribeOn(Schedulers.io())
                .subscribeOn(AndroidSchedulers.mainThread())
                .subscribe(new Consumer() {
                    @Override
                    public void accept(Object o) throws Exception {
                        Log.d(TAG, o.toString());
                    }
                });

且看,我們需要對某個集合裡面的數據一一進行變換,然後發送出來執行其他操作。

上面便是對集合裡面的每一項進行加一操作,然後再轉換為String類型,然後toList(),組合成集合發送出來,最後在觀察者方法中列印出每一項。

 

三、合併執行

定義兩個被觀察者,各自產生事件,然後合併在一起,發送給一個觀察者。

首先定義我們上面第一個例子的被觀察者,用於發送一個數字:

        Observable observable1 = Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(ObservableEmitter emitter) {
                int i = getNumber();
                if (i < 0) {
                    emitter.onComplete();
                    return;
                } else {
                    Log.d(TAG, Thread.currentThread().getName());
                    emitter.onNext(i);
                    emitter.onComplete();
                }
            }
        })
                .subscribeOn(Schedulers.io());

 

其次再定義我們上面第二個例子的被觀察者:

        List<Integer> list = new ArrayList<Integer>() {
            {
                add(0);
                add(1);
                add(2);
            }
        };
        Observable observable2 = Observable.fromIterable(list).map(new Function() {
            @Override
            public Object apply(Object o) {
                int i = (int) o + 1;
                return String.valueOf(i);
            }
        })
                .toList()
                .toObservable().subscribeOn(Schedulers.io());

 

最後將這兩個被觀察者的事件合併起來發送給一個觀察者:

        Disposable disposable = Observable.zip(observable1, observable2, new BiFunction() {
            @Override
            public Object apply(Object o, Object o2) throws Exception {
                int i = (int) o;
                String k = (String) ((List) o2).get(0);
                return k + i;
            }
        })
                .subscribe(new Consumer() {
                    @Override
                    public void accept(Object o) {
                        Log.d(TAG, (String) o);
                    }
                }, new Consumer<Throwable>() {
                    @Override
                    public void accept(Throwable throwable) {
                        Log.d(TAG, throwable.getMessage());
                    }
                });

zip方法,顧名思義,有點類似與於打包的意思。

o為被觀察者1返回的結果,o2為被觀察2返回的結果,將這兩個結果一起處理後發送給觀察者。列印出來。

現在先介紹這幾個,找個時間再整理一些其他的用法以及原理實現。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 為什麼要分庫分表? 隨著近些年信息化大躍進,各行各業無紙化辦公產生了大量的數據,而越來越多的數據存入了資料庫中。當使用 資料庫的時候,單表超出了2000萬數據量就會出現性能上的分水嶺。並且物理伺服器的CPU、記憶體、存儲、連接數等資源有限,某個時段大量連接同時執行操作,會導致資料庫在處理上遇到性能瓶頸 ...
  • 一、總體優化思路 首先構建腳本觀察查詢數,連接數等數據,確定環境原因以及內部SQL執行原因,然後根據具體原因做具體處理。 二、構建腳本觀察狀態 mysqladmin -uroot -p ext \G 該命令可獲取當前查詢數量等信息,定時輪詢並將結果重定向到文本中,然後處理成圖表。 三、處理對策 1. ...
  • 問題描述:lsnrctl start啟動監聽起不來,一直卡在connecting to半天 1.[oracle@orcl ~]$ lsnrctl start 一直卡半天,就是連不上,按照以前的解決辦法,重啟監聽 2.[root@orcl ~]# ps -ef | grep tns 切入root用戶, ...
  • 查詢全部的記錄: select * from test_limit ; 查第一條記錄: select * from test_limit limit 1; 查前面兩條記錄: select * from test_limit limit 0,2; 查第二和第三條記錄: select * from te ...
  • 命令行如下: 說明: ...
  • 最近遇到了錯誤“Error: cannot fetch last explain plan from PLAN_TABLE”,於是稍微研究了一下哪些場景下碰到這種錯誤,具體參考下麵案例: 1:忘記使用EXPLAIN PLAN放在SQL語句前面,然後使用使用SELECT * FROM TABLE(DB... ...
  • 安裝與部署SSRS步驟 什麼是SSRS SQL Server Reporting Serivces(SSRS) 是一種強大的報表設計開發工具或者說是服務,它提供了一系列本地工具和服務,用於創建、部署和管理移動和分頁報表。 SSRS可以獨立安裝和部署在本機,運行在服務當中,可集成到自己的程式中進行調用 ...
  • 本博客部分內容是來自http://blog.csdn.net/dreamzml/article/details/9951577FragmentPagerAdapterFragmentPagerAdapter 繼承自 PagerAdapter。相比通用的 PagerAdapter,該類更專註於每一頁均 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...