遗留代码。我们都讨厌它。因为它只能停留在旧技术上,有时候对代码进行即使轻微地更改也会导致您无法想象的错误。专业工程师不应该害怕遗产。
RxJava是一个库,可以帮助您改善遗留项目的情况,并从创建的代码中获得更多满足感。
这一切都与Observables有关。
Observable是RxJava的基础。这可能是什么?,你可能会问。这是你可以观察到的东西。你能看到什么?任何你想要的。您可以对Collection,Future,Range中的单个元素创建Observable可观察者,如String“Hello”。您可以将它们合并,合并它们。这就像冲浪。
Observable.just(“one”, “two”) .subscribe(System.out::println); Observable.fromIterable(Arrays.asList(“one”, “two”, “three”)) .subscribe(System.out::println);
拥有Observable后,您可以在其上使用运算符,就像在Java中的流一样。你拥有它们更多,它们就更多地为你提供了极大的灵活性。
getDataFromNetwork() <font><i>// this method returns an Observable</i></font><font> .skip(10) .take(5) .map(s -> s + “ transformed”) .subscribe(System.out::println); </font>
这里有一个订阅。这是您对数据执行某些操作的地方。如果我不订阅Observable,会发生什么事吗?这取决于您的Observable是热还是冷。冷的会等待订阅它,热的会立即开始收到。
遗产中的RxJava
现在,RxJava如何帮助您使用遗留代码?首先,许多遗留项目都使用Java <8的版本.RxJava的优点是,它适用于Java 6。
使用Java 6/7可能会引起一些抑郁,因为它缺乏新的,酷的Java功能。在介绍RxJava时,您可以带来一些新功能,编写更多功能和异步代码。你怎么能改进你的代码?
让我解释一下背景。我们有一个旧的客户端应用程序,用Java 6编写,与巨大的遗留代码库相结合。UI是用Swing编写的。每一个工作都很慢,改变代码是非常危险的,我们非常积极地为此做些什么。本文中的示例在Java 8中,不要用旧的语法和匿名类来处理你的眼睛。所有这些都可以在Java 6中实现。
弹性
RxJava具有为您提供处理错误的极好方法的机制。最基本的是在处理数据流期间发生错误时简单地执行操作。更高级的机制可以帮助您使应用程序更具有错误恢复能力:
遗留项目通常是异常反模式编码的。通过上述机制,可以更容易地封装负责错误处理的逻辑,并避免将其合并到正常的程序执行流程中。
消息驱动
遗留代码中的一个流行问题是组件之间的紧密耦合,以及意大利面条架构。显然,ReactiveX本身并不能解决这个问题,但它带来了一些新的可能性。其中之一是将应用程序中的独立组件与基于RxJava Observables的事件总线相连接。
这种事件总线结合了两个接口:publisher和observable。Publisher负责触发eventbus上的事件。如果组件需要触发某些事件,则该组件将依赖于此接口。
<b>interface</b> EventBusPublisher { <b>void</b> userLoggedIn(Long userId); <b>void</b> moneyPayedIn(BigDecimal moneyAmount); <b>void</b> itemAddedToCart(Long itemId); }
可观察的界面可以监听事件。当组件需要侦听更改时,它将依赖于它。
<b>interface</b> EventBusObservable { Observable <Long> userLoggedIn(); Observable <BigDecimal> moneyPayedIn(); Observable <Long> itemAddedToCart(); }
现在让我们在EventBus类中实现这些接口。为了使其简洁,您需要一个主题,它是ReactiveX中提供的抽象。主体既是观察者又是被观察者。因此,您可以触发主题上的事件并能够观察这些项目。它实现了一个Observable被观察接口,因此您可以在其上执行所有标准的RxJava工作流。要在主题上发出事件,请调用其onNext方法。要将其用作Observable,只需使用其实例即可。
<b>class</b> EventBus implements EventBusObservable, EventBusPublisher{ <b>private</b> <b>final</b> Subject<BigDecimal> moneyPayedIn = BehaviorSubject.create(); <b>private</b> <b>final</b> Subject<Long> userLoggedIn = BehaviorSubject.create(); <b>private</b> <b>final</b> Subject<Long> itemAddedToCart = BehaviorSubject.create(); @Override <b>public</b> Observable<BigDecimal> moneyPayedIn() { <b>return</b> moneyPayedIn; } @Override <b>public</b> <b>void</b> moneyPayedIn(BigDecimal moneyAmount) { moneyPayedIn.onNext(moneyAmount); }
您应该使用哪种主题实现?这取决于您的需求。
BehaviorSubject向连接到它的订户发出最新事件和所有后续事件;您也可能更喜欢使用PublishSubject,它只发出订阅服务器连接后发生的事件或其他一些实现。所有决定权都在你手里。