我正在使用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
”,因为它是一个“冷可观察”的背压管理。另一方面,我知道请求的结果将是成功(带有响应)或错误,所以我不知道是否应该使用Flowable
或Single
甚至{{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
/ Observable
和saveUser
/ Single
/ {在Flowable
方法中{1}}。
答案 0 :(得分:32)
背压是当源Observable
以比Subscriber
消耗它们更快的方式发出项目时获得的。它通常是热可观察对象的关注点,而不是像网络请求那样的冷。
我认为您应该在Completable
方法中使用Observable<Void>
而不是saveUser
,并在跟踪请求/响应或输入/输出的所有位置使用Single
图案。当您真正想要连续的事件流时,应该使用Observable
。
答案 1 :(得分:16)
Observable
发送项目的速度超过运营商或订阅者可以使用时,会发生
知道,Backpressure不是您的问题,因为Observable
只会发出一个项目,因此Flowable
不是一个好的候选人。
因此,真正的问题是Completable
是Observable
还是saveUser
而Single
是Observable
还是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(...);
(我没有提到Flowable
与backpressure Observable
的{{1}}}。
答案 3 :(得分:2)
据我了解,你应该使用 单身:当你非常确定要获得一件物品时,否则你会收到错误。 例如:GET - card /:id
也许:如果您不确定是否会获得物品,那么这是正确的解决方案。 例如:GET - card?license-plate = xvar3
可完成:当您只想知道是否已采取行动时。 例如:PUT或DETELE
可观察:当物品数量不是很大时。
Flowable:当你不知道你将获得的物品数量时。
答案 4 :(得分:0)
Observable
(服务)发出物品的速度比观察者(客户)快,那么您应该使用Flowable
来受益于背压机制。 热可观察 Single
或Maybe
。区别在于,如果要处理服务在这种情况下不发送任何响应或错误的情况,则最好利用Single
回调来使用onError()
。如果您不确定服务会失败还是成功,并且不介意空洞而去Maybe
。WRITE
请求不返回任何内容(仅当您想通过返回布尔值来确保数据时),我将使用Completable
执行操作并调用{{1 }}。