一般而言,我对RXJava相对较新(实际上仅在RXJava2中才开始使用它),而且我能找到的大多数文档都倾向于RXJava1。我现在通常可以在两者之间进行翻译,但是整个Reactive的内容是如此之大,以至于它是一个压倒性的API,具有很好的文档(当您可以找到它时)。我正在尝试简化我的代码,这是我想做的简单的步骤。我要解决的第一个问题是我在当前项目中经常做的这种常见模式:
您有一个请求,如果成功,将用于发出第二个请求。
如果任何一个失败,则您需要能够确定哪个失败了。 (主要是显示自定义UI警报)。
这是我现在通常的做法:
(为简单起见,省略了.subscribeOn/observeOn
)
Single<FirstResponse> first = retrofitService.getSomething();
first
.subscribeWith(
new DisposableSingleObserver<FirstResponse>() {
@Override
public void onSuccess(final FirstResponse firstResponse) {
// If FirstResponse is OK…
Single<SecondResponse> second =
retrofitService
.getSecondResponse(firstResponse.id) //value from 1st
.subscribeWith(
new DisposableSingleObserver<SecondResponse>() {
@Override
public void onSuccess(final SecondResponse secondResponse) {
// we're done with both!
}
@Override
public void onError(final Throwable error) {
//2nd request Failed,
}
});
}
@Override
public void onError(final Throwable error) {
//firstRequest Failed,
}
});
在RXJava2中,有没有更好的方法来解决这个问题?
我已经尝试过
flatMap
和它的变体,甚至是Single.zip
或类似的东西,但是我不确定最简单,最常见的模式是什么。如果您想知道FirstRequest是否会在SecondRequest中获取我需要的实际
Token
。没有 token ,无法再次发出请求。 最佳答案
我建议使用平面 map (如果可以的话,可以使用retrolambda)。
另外,如果您不对其进行任何操作,则无需保留返回值(例如Single<FirstResponse> first
)。
retrofitService.getSomething()
.flatMap(firstResponse -> retrofitService.getSecondResponse(firstResponse.id)
.subscribeWith(new DisposableSingleObserver<SecondResponse>() {
@Override
public void onSuccess(final SecondResponse secondResponse) {
// we're done with both!
}
@Override
public void onError(final Throwable error) {
// a request request Failed,
}
});
This文章帮助我全面思考了如何构造RxJava。如果可能的话,您希望您的链条是高级操作的列表,以便可以将其理解为一系列操作/转换。
编辑
如果没有lambda,则可以仅将
Func1
用于flatMap。做同样的事情只是增加了很多样板代码。retrofitService.getSomething()
.flatMap(new Func1<FirstResponse, Observable<SecondResponse> {
public void Observable<SecondResponse> call(FirstResponse firstResponse) {
return retrofitService.getSecondResponse(firstResponse.id)
}
})
.subscribeWith(new DisposableSingleObserver<SecondResponse>() {
@Override
public void onSuccess(final SecondResponse secondResponse) {
// we're done with both!
}
@Override
public void onError(final Throwable error) {
// a request request Failed,
}
});
关于java - RXJava2 : correct pattern to chain retrofit requests,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43355395/