Looking for rx-java Answers? Try Ask4KnowledgeBase
Looking for rx-java Keywords? Try Ask4Keywords

rx-javarx-java入門


備註

本節提供rx-java的基本概述和表面介紹。

RxJava是Reactive Extensions的Java VM實現:一個用於通過使用可觀察序列來編寫異步和基於事件的程序的庫。

Wiki Home上了解有關RxJava的更多信息

版本

狀態最新穩定版發布日期
1.x中穩定 1.3.0 2017年5月5日
2.X 穩定 2.1.1 2017年6月21日

RxJava簡介

RxJava的核心概念是ObservablesSubscribersObservable 發出對象,而Subscriber 它們。

可觀察

Observable 是一個實現反應式設計模式的類。這些Observables提供了允許消費者訂閱事件更改的方法。事件更改由observable觸發。 Observable 可以擁有的訂閱者數量或Observable 可以發出的對像數量沒有限制。

舉個例子:

Observable<Integer> integerObservable = Observable.just(1, 2, 3); // Integer observable
Observable<String> stringObservable = Observable.just("Hello, ", "World", "!"); // String observable
 

在這裡,所謂的可觀察對象integerObservablestringObservable 從工廠方法創建just 由RX庫提供。請注意, Observable 是通用的,因此可以發出任何對象。

訂戶

Subscriber 是消費者。 Subscriber 只能訂閱一個 observable。 Observable 調用SubscriberonNext()onCompleted()onError() 方法。

Subscriber<Integer> mSubscriber = new Subscriber<Integer>() {
        // NOTE THAT ALL THESE ARE CALLED BY THE OBSERVABLE
        @Override
        public void onCompleted() {
            // called when all objects are emitted
            System.out.println("onCompleted called!");
        }

        @Override
        public void onError(Throwable throwable) {
            // called when an error occurs during emitting objects
            System.out.println("onError called!");
        }

        @Override
        public void onNext(Integer integer) {
            // called for each object that is emitted
            System.out.println("onNext called with: " + integer);
        }
    };
 

請注意, Subscriber 也是通用的,可以支持任何對象。 Subscriber 必須通過調用observable上的subscribe 方法來subscribe observable。

integerObservable.subscribe(mSubscriber);
 

以上,運行時,將產生以下輸出:

onNext called with: 1
onNext called with: 2
onNext called with: 3
onCompleted called!
 

你好,世界!

以下打印消息Hello, World! 控制台

public void hello() {
  Observable.just("Hello, World!") // create new observable
    .subscribe(new Action1<String>() { // subscribe and perform action

       @Override
       public void call(String st) {
         System.out.println(st);
       }

    });
}
 

或者使用Java 8 lambda表示法

public void hello() {
      Observable.just("Hello, World!") // create new observable
        .subscribe(onNext -> { // subscribe and perform action
             System.out.println(onNext);   
        });
}
 

安裝或設置

rx-java設置

  1. 搖籃

    compile 'io.reactivex:rxjava2:rxjava:2.1.1'
     
  2. Maven的

    <dependency>
        <groupId>io.reactivex.rxjava2</groupId>
        <artifactId>rxjava</artifactId>
        <version>2.1.1</version>
    </dependency>
     
  3. 常春藤

    <dependency org="io.reactivex.rxjava2" name="rxjava" rev="2.1.1" />
     
  4. 來自JFrog的快照

    repositories {
    maven { url 'https://oss.jfrog.org/libs-snapshot' }
    }
    
    dependencies {
        compile 'io.reactivex:rxjava:2.0.0-SNAPSHOT'
    }
     
  5. 如果您需要下載jar而不是使用構建系統,請使用所需的版本創建這樣的Maven pom 文件:

    <?xml version="1.0"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <groupId>com.netflix.rxjava.download</groupId>
        <artifactId>rxjava-download</artifactId>
        <version>1.0-SNAPSHOT</version>
        <name>Simple POM to download rxjava and dependencies</name>
        <url>http://github.com/ReactiveX/RxJava</url>
        <dependencies>
            <dependency>
                <groupId>io.reactivex</groupId>
                <artifactId>rxjava</artifactId>
                <version>2.0.0</version>
                <scope/>
            </dependency>
        </dependencies>
    </project>
     

然後執行:

$ mvn -f download-rxjava-pom.xml dependency:copy-dependencies
 

該命令將rxjava-*.jar 及其依賴項下載到./target/dependency/.

您需要Java 6或更高版本。

了解大理石圖

Observable可以被認為只是一系列事件。定義Observable時,您有三個偵聽器:onNext,onComplete和onError。每次observable獲取新值時都會調用onNext。如果父Observable通知它已完成生成更多值,則將調用onComplete。如果在執行Observable鏈期間隨時拋出異常,則調用onError。為了在Rx中顯示操作符,大理石圖用於顯示特定操作所發生的情況。下面是一個簡單的Observable運算符“Just”的示例。

大理石圖的示例

大理石圖具有表示正在執行的操作的水平塊,表示已完成事件的垂直條,表示錯誤的X,以及表示值的任何其他形狀。考慮到這一點,我們可以看到“Just”將只取我們的值並執行onNext,然後使用onComplete完成。還有很多操作只是“Just”。您可以在ReativeX站點上看到ReactiveX項目中的所有操作以及RxJava中的實現 。通過RxMarbles網站還有交互式大理石圖。