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网站还有交互式大理石图。