RxJava在Android开发者中变得越来越受欢迎。唯一的问题是不容易开始,尤其是大多数人以前使用命令编程语言。但一旦你明白了,你会发现RxJava真的很棒。 这只是为了帮助你了解RxJava,整个系列有四篇文章文章,希望看完这四篇文章,能理解RxJava背后的想法,喜欢RxJava。
基础RxJava最核心的两件事是Observables(观察者,事件源)和Subscribers(观察者)。Observables发布了一系列事件,Subscribers处理了这些事件。这里的事件可以是任何你感兴趣的东西(触摸事件,web接口调用返回的数据。。。) Observable可以发送零或多个事件,知道结束或错误。每次发生事件时,都会调用Subscriber的onnnext方法,最后调用Subscriber.onNext()或Subscriber.onError()结束。
Rxjava似乎想设计模式中的观察者模式,但有一个明显的区别,那就是如果一个observerble没有任何Subscriber,那么observable就不会发生任何事件。
Hello World创建Observable对象非常简单,直接调用Observable.create就够了
[java] view plain copy
1. Observable<String> myObservable = Observable.create( 2. new Observable.OnSubscribe<String>() { 3. @Override 4. public void call(Subscriber<? super String> sub) { 5. "Hello, world! super String> sub) { 5. "Hello, world!"); 6. sub.onCompleted(); 7. } 8. } 9. );
[java] view plain copy
1. Subscriber<String> mySubscriber = new Subscriber<String>() { 2. @Override 3. public void onNext(String s) { System.out.println(s); } 4. 5. @Override 6. public void onCompleted() { } 7. 8. @Override 9. public void onError(Throwable e) { } 10. };
[java] view plain copy
1. myObservable.subscribe(mySubscriber);
代码更简洁
你觉得只是为了打印helolo吗? world写这么多代码太罗嗦了?我主要用这种罗嗦的写法来展示RxJava背后的原理。RxJava实际上提供了许多方便的函数来帮助我们减少代码。
首先,让我们来看看如何简化Observable对象的创建过程。RxJava内置了许多简化Observable对象创建的函数,如Observable.just是用来创建Observable对象,它只发送一个事件,创建Observable对象的代码可以简化为一行
[java] view plain copy
1. Observable<String> myObservable = Observable.just("Hello, world!");
[java] view plain copy
1. Action1<String> onNextAction = new Action1<String>() { 2. @Override 3. public void call(String s) { 4. System.out.println(s); 5. } 6. };
[java] view plain copy
1. myObservable.subscribe(onNextAction, onErrorAction, onCompleteAction);
我们不在乎oneror和oncomplete,所以我们只需要第一个参数
[java] view plain copy
1. myObservable.subscribe(onNextAction); 2. // Outputs "Hello, world!"
上面的代码最终可以写成这样
[java] view plain copy
1. Observable.just("Hello, world!") 2. new Action1<String>() { 3. @Override 4. public void call(String s) { 5. System.out.println(s); 6. } 7. });
使用java8lambda可以使代码更加简洁
[java] view plain copy
1. Observable.just("Hello, world!") 2. .subscribe(s -> System.out.println(s));
强烈推荐Android开发使用
gradle插件retrolambda,这样您就可以在您的代码中使用lambda。
变换让我们做一些更有趣的事情!
例如,我想在helloo中 在world中加上我的签名,你可能会想到修改observable对象:
[java] view plain copy
1. Observable.just("Hello, world! -Dan") 2. .subscribe(s -> System.out.println(s));
如果你能改变observable对象,那当然是可以的,但是如果你不能修改observable对象呢?例如,observable对象由第三方库提供?例如,我的observable对象是由多个subscriber订阅的,但我只想修改订阅者?
那么如何在Subscriber中修改事件呢?例如,以下代码:
[java] view plain copy
1. Observable.just("Hello, world!") 2. " -Dan"));
这种方式还是不尽如人意,因为我希望我的Subscribers越轻越好,因为我可能会在mainthread中运行Subscriber。此外,根据响应函数编程的概念,Subscribers应该做的是“响应”,而不是修改Observable发生的事件。如果我能在某些中间步骤中对待“如果我能在某些中间步骤中对待”Hello World!变换是不是很酷?
操作符(Operators)操作符是为了解决Observable对象转换的问题。操作符用于修改Observable与最终Subscriber之间发生的事件。RxJava提供了许多有用的操作符。
例如,map操作符是用来将一个事件转换为另一个事件的。
[java] view plain copy
1. Observable.just("Hello, world!") 2. new Func1<String, String>() { 3. @Override 4. public String call(String s) { 5. return s + " -Dan"; 6. } 7. }) 8. .subscribe(s -> System.out.println(s));
使用lambda可以简化为
[java] view plain copy
1. Observable.just("Hello, world!") 2. " -Dan") 3. .subscribe(s -> System.out.println(s));
高级map操作符
map操作符更有趣的是,它不需要返回observable对象返回的类型。您可以使用map操作符返回发送新数据类型的observable对象。
例如,在上面的例子中,subscriber并不关心返回的字符串,而是希望字符串的hash值
[java] view plain copy
1. Observable.just("Hello, world!") 2. new Func1<String, Integer>() { 3. @Override 4. public Integer call(String s) { 5. return s.hashCode(); 6. } 7. }) 8. .subscribe(i -> System.out.println(Integer.toString(i)));
[java] view plain copy
1. Observable.just("Hello, world!") 2. .map(s -> s.hashCode()) 3. .subscribe(i -> System.out.println(Integer.toString(i)));
[java] view plain copy
1. Observable.just("Hello, world!") 2. .map(s -> s.hashCode()) 3. .map(i -> Integer.toString(i)) 4. .subscribe(s -> System.out.println(s));
不服?
你认为我们的例子太简单了,不足以说服你吗?您需要了解以下两点:
1.Observable和Subscriber可以做任何事情
Observable可以是数据库查询,Subscriber用于显示查询结果;Observable可以是屏幕上的点击事件,Subscriber用于响应点击事件;Observable可以是网络请求,Subscribler用于显示请求结果。
2.Observable和Subscriber是独立于中间的变换过程。
可以在observable和subscriber之间添加或减少任何数量的map。整个系统高度可组合,操作数据是一个非常简单的过程。