深入浅出RxJava(一:基础篇)

发布时间:2023-05-09 09:46:28

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。整个系统高度可组合,操作数据是一个非常简单的过程。

ps 图灵课堂老师从近一百套最新一线互联网公司面试题中精选而出,涵盖Java架构面试 所有技术栈,包括JVM,Mysql,并发,Spring,Redis,MQ,Zookeeper,Netty, Dubbo,Spring Boot,Spring Cloud,数据结构与算法,设计模式等相关技术领域的大 厂面试题及详解。 详情咨询客服获取全套面经试题。

上一篇 深入浅出RxJava(二:操作符)
下一篇 android上的JAVA8:使用retrolambda

文章素材均来源于网络,如有侵权,请联系管理员删除。

标签: