RxJava 2.x:我应该使用Flowable还是Single / Completable?

时间:2017-03-01 07:25:38

标签: java android reactive-programming rx-java2

我正在使用Clean Architecture开发Android应用程序,我正在将其迁移到RxJava 2.x.我必须向soap服务发出一些网络请求,所以我在域模块中定义了api接口:

public interface SiginterApi {
    Observable<User> login(String user, String password);
    ...
    Observable<List<Campaign>> getCampaigns(List<Long> campaignIds);
}

我已经读过网络请求应该使用“Flowable”,因为它是一个“冷可观察”的背压管理。另一方面,我知道请求的结果将是成功(带有响应)或错误,所以我不知道是否应该使用FlowableSingle甚至{{1} }。

此外,我有这样的数据库访问:

Observable

我不知道我是否应该使用public interface UserRepository extends Repository { Observable<Void> saveUser(String username, String hashedPassword, boolean logged, User user); ... Observable<User> findUser(String username, String hashedPassword); } 方法中的Completable / Flowable / ObservablesaveUser / Single / {在Flowable方法中{1}}。

5 个答案:

答案 0 :(得分:32)

背压是当源Observable以比Subscriber消耗它们更快的方式发出项目时获得的。它通常是可观察对象的关注点,而不是像网络请求那样的

我认为您应该在Completable方法中使用Observable<Void>而不是saveUser,并在跟踪请求/响应或输入/输出的所有位置使用Single图案。当您真正想要连续的事件流时,应该使用Observable

答案 1 :(得分:16)

Observable发送项目的速度超过运营商或订阅者可以使用时,会发生

Backpressure

知道,Backpressure不是您的问题,因为Observable只会发出一个项目,因此Flowable不是一个好的候选人。

因此,真正的问题是CompletableObservable还是saveUserSingleObservable还是findUser为了简化和明确您的API,预期会有一个结果(成功或失败),您应该明确使用Completable / Single否则很难理解只发出一个值可能会误导您的API用户。

答案 2 :(得分:4)

基数是理解可完成可能之间差异的一种方式:

  • Maybe<T>只是一个基数为0或1的Observable,即它代表的结果可以存在与否。
  • Single<T>是一个Observable,它总是返回一个结果,即基数为1.
  • Completable可以解释为Observable<Void>,即基数为0.

因此,在您的情况下,您可以通过以下方式更改存储库的签名:

Completable saveUser(...);

Single<User> findUser(...);

(我没有提到Flowablebackpressure Observable的{​​{1}}}。

答案 3 :(得分:2)

据我了解,你应该使用 单身:当你非常确定要获得一件物品时,否则你会收到错误。 例如:GET - card /:id

也许:如果您不确定是否会获得物品,那么这是正确的解决方案。 例如:GET - card?license-plate = xvar3

可完成:当您只想知道是否已采取行动时。 例如:PUT或DETELE

可观察:当物品数量不是很大时。

Flowable:当你不知道你将获得的物品数量时。

答案 4 :(得分:0)

  • 如果您的Observable(服务)发出物品的速度比观察者(客户)快,那么您应该使用Flowable来受益于背压机制。 热可观察
  • 如果您的服务在每个请求和按需数据(API的大多数情况)下仅发出一次,则应将其视为冷可观察的。在这种情况下,请使用SingleMaybe。区别在于,如果要处理服务在这种情况下不发送任何响应或错误的情况,则最好利用Single回调来使用onError()。如果您不确定服务会失败还是成功,并且不介意空洞而去Maybe
  • 在这种用例中,
  • 99%的数据库WRITE请求不返回任何内容(仅当您想通过返回布尔值来确保数据时),我将使用Completable执行操作并调用{{1 }}。