RxJava是遗留代码的解药 - PawełMatyjasik

19-01-15 banq
              

遗留代码。我们都讨厌它。因为它只能停留在旧技术上,有时候对代码进行即使轻微地更改也会导致您无法想象的错误。专业工程师不应该害怕遗产。

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() // this method returns an Observable
.skip(10)
.take(5)
.map(s -> s + “ transformed”)
.subscribe(System.out::println);

这里有一个订阅。这是您对数据执行某些操作的地方。如果我不订阅Observable,会发生什么事吗?这取决于您的Observable是热还是冷。冷的会等待订阅它,热的会立即开始收到。

遗产中的RxJava

现在,RxJava如何帮助您使用遗留代码?首先,许多遗留项目都使用Java <8的版本.RxJava的优点是,它适用于Java 6。

使用Java 6/7可能会引起一些抑郁,因为它缺乏新的,酷的Java功能。在介绍RxJava时,您可以带来一些新功能,编写更多功能和异步代码。你怎么能改进你的代码?

让我解释一下背景。我们有一个旧的客户端应用程序,用Java 6编写,与巨大的遗留代码库相结合。UI是用Swing编写的。每一个工作都很慢,改变代码是非常危险的,我们非常积极地为此做些什么。本文中的示例在Java 8中,不要用旧的语法和匿名类来处理你的眼睛。所有这些都可以在Java 6中实现。

弹性

RxJava具有为您提供处理错误的极好方法的机制。最基本的是在处理数据流期间发生错误时简单地执行操作。更高级的机制可以帮助您使应用程序更具有错误恢复能力:

  • onErrorReturn - 如果发生错误,Observable将发出默认值,
  • onErrorResumeNext - 如果上游失败,使用另一个Observable,
  • 重试 - 再试一次,也许这次它有效。

遗留项目通常是异常反模式编码的。通过上述机制,可以更容易地封装负责错误处理的逻辑,并避免将其合并到正常的程序执行流程中。

消息驱动

遗留代码中的一个流行问题是组件之间的紧密耦合,以及意大利面条架构。显然,ReactiveX本身并不能解决这个问题,但它带来了一些新的可能性。其中之一是将应用程序中的独立组件与基于RxJava Observables的事件总线相连接。

这种事件总线结合了两个接口:publisher和observable。Publisher负责触发eventbus上的事件。如果组件需要触发某些事件,则该组件将依赖于此接口。

interface EventBusPublisher {
    void userLoggedIn(Long userId);
    void moneyPayedIn(BigDecimal moneyAmount);
    void itemAddedToCart(Long itemId);
}

可观察的界面可以监听事件。当组件需要侦听更改时,它将依赖于它。

interface EventBusObservable {
   Observable <Long> userLoggedIn();
   Observable <BigDecimal> moneyPayedIn();
   Observable <Long> itemAddedToCart();
}

现在让我们在EventBus类中实现这些接口。为了使其简洁,您需要一个主题,它是ReactiveX中提供的抽象。主体既是观察者又是被观察者。因此,您可以触发主题上的事件并能够观察这些项目。它实现了一个Observable被观察接口,因此您可以在其上执行所有标准的RxJava工作流。要在主题上发出事件,请调用其onNext方法。要将其用作Observable,只需使用其实例即可。

class EventBus implements EventBusObservable, EventBusPublisher{
private final Subject<BigDecimal> moneyPayedIn = 
                                  BehaviorSubject.create();
private final Subject<Long> userLoggedIn = BehaviorSubject.create();
private final Subject<Long> itemAddedToCart =    
                                  BehaviorSubject.create();

@Override
    public Observable<BigDecimal> moneyPayedIn() {
        return moneyPayedIn;
    }
    @Override
    public void moneyPayedIn(BigDecimal moneyAmount) {
        moneyPayedIn.onNext(moneyAmount);
    }

您应该使用哪种主题实现?这取决于您的需求。

BehaviorSubject向连接到它的订户发出最新事件和所有后续事件;您也可能更喜欢使用PublishSubject,它只发出订阅服务器连接后发生的事件或其他一些实现。所有决定权都在你手里。

              

1