一般来说,我对 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 会获取实际的Token
我需要在第二个请求中。如果没有令牌,则无法发出第二个请求。
我建议使用平面地图(并且逆转录酶 https://github.com/orfjackal/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 http://blog.danlew.net/2015/03/02/dont-break-the-chain/这篇文章帮助我思考了 RxJava 总体结构的风格。如果可能的话,您希望您的链成为高级操作的列表,以便可以将其读取为一系列操作/转换。
EDIT如果没有 lambda,你可以只使用Func1
为你的平面地图。做同样的事情只是更多的样板代码。
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,
}
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)