[英]Simplifying Retrofit2 and Rxjava2 chained calls to use a Single instead of Observable in the final result
我要完成的工作是将调用更新到预订结束时的所有位置,以返回Single而不是Observable,因为我只收到1个结果,但是由于合并调用的性质,我不得不移至可观察对象,以利用可观察方法将结果重新结合为单个结果。
我遇到的问题是试图弄清楚如何将1次调用的结果用于另一个调用,然后将该结果与另一个调用合并,然后返回两者的组合。
我的呼叫顺序如下:
这是我现在拥有的代码。 对象等仅是示例,但是序列和调用正是我所拥有的:
翻新服务:
@GET("/api/Profile/Author")
Observable<AuthorJson> getAuthor();
@POST("/api/Logo")
Observable<BookLogoJson> uploadBookLogos(@Header("Content-Type") String content_type, @Body RequestBody logo);
@POST("/api/Book")
Single<BookDetailsJson> newBook(@Body BookDetailRequest request);
实际执行
List<Book> bookLogos = ...;
Observable.fromIterable(bookLogos)
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.io())
.flatMap(new Function<String, ObservableSource<BookLogoJson>>() {
@Override
public ObservableSource<BookLogoJson> apply(@NonNull String bookLogos) throws Exception {
return mApi.uploadBookLogos(mContentType, getRequestBody(bookLogos, context));
}
}).toList().flatMap(new Function<List<BookLogoJson>, SingleSource<BookDetailsJson>>() {
@Override
public SingleSource<BookDetailsJson> apply(@NonNull List<BookLogoJson> bookLogosRaw) throws Exception {
BookDetailRequest request = new BookDetailRequest();
for(BookLogoJson logo : bookLogosRaw){
request.mLogos.add(logo.mId);
}
return mApi.newBook(request);
}
}).toObservable().flatMap(new Function<BookDetailsJson, ObservableSource<Book>>() {
@Override
public ObservableSource<Book> apply(@NonNull BookDetailsJson BookDetailsJson) throws Exception {
return Observable.zip(mApi.getAuthor(),
Observable.just(BookDetailsJson),
new BiFunction<AuthorJson, BookDetailsJson, Book>() {
@Override
public Book apply(AuthorJson author, BookDetailsJson bookDetails) throws Exception {
return mConverter.getBook(author, bookDetails);
}
});
}
})
.observeOn(AndroidSchedulers.mainThread())
.subscribeWith(new Observer<Book>() {
@Override
public void onSubscribe(@NonNull Disposable d) {
}
@Override
public void onNext(@NonNull Book book) {
// Here, I will only ever get 1 Book so an observable makes no sense.
}
@Override
public void onError(@NonNull Throwable e) {
}
@Override
public void onComplete() {
}
});
实际上,这非常简单,因为toList().flatMap(...)
的结果已经是Single
。
只需删除对toObservable()
的调用,然后修改flatMap
即可返回Single
:
mApi.getAuthor().firstOrError().map(new Function<AuthorJson, Book>() {
public Book apply(@NonNull AuthorJson author) throws Exception {
// bookDetails captured by anonymous function
return mConverter.getBook(author, bookDetails);
}
});
此外,Retrofit的RxJava转换器还接受Single
替代Observable
。 这在这里可能适用,因为请求总是产生单个结果或错误。 ( Completable
可用于无响应的请求)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.