一、如何使用rxJava

原文地址:https://github.com/ReactiveX/RxJava/wiki/How-To-Use-RxJava
项目中用到的代码地址:http://git.oschina.net/brendanv/learnrxjava

先来个Hello World

为什么第一行代码都喜欢用Hello World?因为这个表示你的程序有了生命。

maven配置

        
            io.reactivex.rxjava2
            rxjava
            2.1.1
        

Hello World

代码在first module的first包。

public class HelloWorld {
    public static void hello(String... names) {
        /**
         * Flowable是2.x版本新增的
         */
        Flowable.fromArray(names).subscribe(new Consumer() {
            @Override
            public void accept(String s) throws Exception {
                System.out.println(s);
            }
        });
        /**
         * Observable是旧版本的
         */
        Observable.fromArray(names).blockingSubscribe(new Consumer() {
            @Override
            public void accept(String s) throws Exception {
                System.out.println(s);
            }
        });
    }

    public static void main(String[] args) {
        hello("Hello World!");
    }
}

官方文档里面使用的是RxJava1,所以有区别。所以rxjava1可以使用

如何使用RxJava

使用RxJava需要创建一些Observable(用来发射数据),以各种方式转换这些Observable获取需要的数据项,再订阅这些数据项。

创建Observable

要创建一个Observable,您可以通过将一个函数传递给具有Observable行为的create()来手动实现Observable的行为,也可以通过使用为此目的设计的一些Observable操作符将现有数据结构转换为Observable 。

使用现有的数据创建Observable

我们的hello world程序就是使用已有的数据来创建Observable的。所以可以使用fromArray()(* 1.x版本为from*)或者just()方法类转换对象,列表,数组为发射这些对象的Observable对象:

Observable stringObservable = Observable.fromArray("a", "b", "c");
Observable oneJust = Observable.just("one Object");
Observable twoJust = Observable.just("one Object", "two Object");

这些转换后的Observable会同步调用任何订阅者的onNext()方法,然后发送这些Observable的每个数据,最后调用订阅者的onCompleted()方法。

使用create()方法创建Observable

你可以使用create创建自定义的Observable来实现异步I/O,计算操作甚至无限的数据流。

同步的Observable示例

public class SyncObservable {
    public static Observable customObservableBlocking() {
        return Observable.create(aSubcriber -> {
            for (int i = 0; i < 50; i++) {
                if (!aSubcriber.isDisposed()) {
                    aSubcriber.onNext("value:" + i);
                }
            }
            if (!aSubcriber.isDisposed()) {
                aSubcriber.onComplete();
            }
        });
    }

    public static void main(String[] args) {
        customObservableBlocking().subscribe(System.out::println);
    }
}

异步的Observable示例

package second;


import io.reactivex.Observable;
import io.reactivex.schedulers.Schedulers;

/**
 * @author
 * @since 2017/7/6 下午8:03
 * Purpose
 */
public class AsyncObservable {

    public static Observable asyncObservable() {
        return Observable.create(aSubscriber->{
            new Runnable(){

                @Override
                public void run() {
                    for(int i=0;i<5;i++) {
                        aSubscriber.onNext("value:"+i);
                    }
                    System.out.println("runnable"+Thread.currentThread());
                }
            }.run();
            System.out.println("observable:"+Thread.currentThread());
            aSubscriber.onComplete();
        });
    }

    public static Observable asyncNonblockingObservabel() {
        return Observable.create(aSubscribe -> {
            for(int i=0;i<5;i++) {
                aSubscribe.onNext("NonBlockingValue:" + i);
            }
        });
    }
    public static void main(String[] args) {
        asyncObservable().subscribeOn(Schedulers.io()).subscribe(System.out::println);
        asyncNonblockingObservabel().subscribeOn(Schedulers.io()).subscribe(System.out::println);
        //main方法容易在线程还没有切换的时候结束,然后就看不到结果了。这个地方卡了我好久啊
        try {
            Thread.sleep(1000*2);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

会发现输出的结果是异步的:

NonBlockingValue:0
NonBlockingValue:1
value:0
value:1
value:2
value:3
value:4
NonBlockingValue:2
runnableThread[RxCachedThreadScheduler-1,5,main]
NonBlockingValue:3
NonBlockingValue:4
observable:Thread[RxCachedThreadScheduler-1,5,main]
Process finished with exit code 0

上面介绍的例子为了简介都没有做错误处理,后面的例子会有错误处理。更多信息可以看Obserbable 和创建Observable页面。

使用操作符转换Observable

RxJava允许链式聚合操作转换和组合Observable。
下面的代码表示忽略前两个,从剩余的里面取两个:

public static void simpleComposition() {
        asyncNonblockingObservabel().skip(2).take(2)
                .map(stringValue -> {
                    return stringValue + "_xform";
                })
                .subscribe(it -> {
                    System.out.println("onNext=>" + it);
                });
    }

下面的交互图是官网的,他发射的是17个值,我懒得画图直接复制了。原理一样。


一、如何使用rxJava_第1张图片
image.png

你可能感兴趣的:(一、如何使用rxJava)