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

Pab*_*lez 35 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);
}
Run Code Online (Sandbox Code Playgroud)

我已经读过网络请求应该用" Flowable"进行,因为背压管理是因为它是'冷可观察'.在另一方面,我知道请求的结果将是成功的(与响应)或错误,所以我不知道我是否应该使用FlowableSingle甚至Observable.

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

public interface UserRepository extends Repository {
    Observable<Void> saveUser(String username, String hashedPassword, boolean logged, User user);
    ...
    Observable<User> findUser(String username, String hashedPassword);
}
Run Code Online (Sandbox Code Playgroud)

我不知道我是否应该使用Completable/ Flowable/ ObservablesaveUser方法和Single/ Flowable/ ObservablefindUser方法.

npa*_*ace 35

背压是当源Observable发射物品比Subscriber消耗它们更快时发出的物质.这通常是观察的一个问题,而不是像您的网络请求那样的观察.

我认为你应该使用Completable而不是Observable<Void>在你的saveUser方法中,并Single用于你遵循请求/响应或输入/输出模式的所有地方.Observable当你真正想要连续的事件流时,应该使用它.

  • 是 - 如果您的"流"发出一个("单一")或零("可完成")值,则不需要背压处理.如果您有一个与服务器的开放连接并且不断地从服务器接收数据,那么您应该使用"Flowable"来处理数据到达速度超过您处理速度的可能性. (3认同)
  • 我相信作者指的是网络和数据库连接,其行为类似于事件流.如果我理解正确,那就与HTTP请求/响应对或单个数据库查询不同. (2认同)
  • 更正:1.x中存在Single和Completable,并且Retrofit for RxJava 1也支持它们。 (2认同)

Nic*_*tto 17

背压时,会发生一个Observable更快速地发射项比操作员或用户可以使用它们.

知道这一点,Backpressure在你的情况下不是问题,因为你的Observable意志只发出一个项目,所以Flowable不是一个好的候选人.

所以真正的问题是,为了简单和清晰的API,是否只使用CompletableObservable为了saveUser 和/ SingleObservable为了findUser这里只有一个结果(成功或失败),你应该明确地使用Completable/ Single否则很难理解只会发出一个值,这可能会误导您的API用户.


lma*_*arx 8

基数是理解CompletableMaybeSingle之间差异的一种方式:

  • A Maybe<T>只是基数为0或1的Observable,即它表示可以存在或不存在的结果。
  • A Single<T>是一个Observable,始终返回结果,即基数为1。
  • Completable可以解释排序为Observable<Void>0即基数。

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

Completable saveUser(...);

Single<User> findUser(...);
Run Code Online (Sandbox Code Playgroud)

(我没有提到s与反压Flowable类似)。Observable