【问题标题】:RxJava, side-effects, and methods that return voidRxJava、副作用和返回 void 的方法
【发布时间】:2017-08-08 21:05:57
【问题描述】:

我已经使用 RxJava 编写了一个存储库,但在找出处理对存储库的写入和删除的最佳方法时遇到了麻烦。

在写这篇文章时,我的目标是确保任何 write 或 delete 方法都能够从 RxJava 副作用方法中调用。这意味着 write / delete 方法必须同步运行并且不返回 Observable。这样我可以做这样的事情:

repository
    .fetchData()
    .doOnNext(s -> if (s.equals("something") {
                       repository.writeData(s);
                   }
    )
    .subscribe();

这是一个简单的例子,但它表明我调用了一个返回 Observable 的存储库方法,订阅该 Observable,当调用 Observable 的 onNext() 方法时,我可以执行我的副作用,即同步写入内存缓存或数据库。

好的,这个例子很好用,但现在我遇到了一个问题,我只需要从内存缓存或数据库中写入或删除数据。也就是我想用RxJava运行同步代码,方法返回void。

我的存储库 API 的编写方式我想做一些类似调用 repository.deleteData() 的事情,但是我想在主线程之外执行此操作。解决这个问题的一种方法是放弃 RxJava,只创建一个线程来执行任务。这可行,但我用 RxJava 做所有其他事情,所以我也想在这里使用它。

我找到了 2 个可能的解决方案,但不确定它们的正确性:

1) 使用Observable.just(null) 启动一个可观察对象,然后使用doOnNext() 副作用方法来调用我的存储库的方法。这行得通,它看起来很老套,但它让我可以使用 RxJava 并让我指定要订阅/观察的线程,这使得线程变得容易,并允许存储库的 API 保持不变,以便它仍然返回 void。

2) 我也可以执行Observable.defer() 之类的操作,然后从 defer 的调用方法中返回Observable.just(repository.deleteData())。如果我这样做,我必须更改存储库的 API,以便 deleteData 方法具有 Void 返回类型而不是 void(并且该方法添加了 return null; 以履行方法签名的合同)。这也允许我使用 RxJava,指定我想要观察和订阅的线程,并继续使用 Observable,即使我真正做的是副作用。

RxJava 有没有办法创建一个 Observable,它调用一个返回类型为 void 的方法,该方法在副作用方法之外运行同步代码?

【问题讨论】:

  • 这个link 可以帮助你。考虑 rxjava 和 rxjava2 的区别,我认为你的第一个解决方案是常见用法。
  • 所以你想从你的同步方法构造 Observables?

标签: rx-java


【解决方案1】:

好吧,为什么不这样呢?

public static <T> Observable<T> observeCompletion(Runnable r) {
   return Observable.defer(() -> {
         r.run();
         return Observable.empty();
   };
}

现在您可以通过 onSubscribe 进行所需的线程跳跃,并将所有内容保存在 Rx 中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-03
    • 1970-01-01
    • 2018-01-07
    • 1970-01-01
    • 1970-01-01
    • 2018-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多