我有以下需要实现的方案:
我使用rxjava2
进行了以下实现到目前为止没有问题,我完全理解它是如何工作的,现在我将上面的内容整合到下面的
我最终得到以下代码
Observable
.zip(Observable.interval(1, TimeUnit.SECONDS), Observable.fromIterable(iterableRequests), new BiFunction<Long, RequestInput, RequestResult>() {
@Override
public RequestResult apply(@NonNull Long aLong, @NonNull final RequestInput request) throws Exception {
return request;
}
})
.map(new Function<RequestResult, ObservableSource<?>>() {
@Override
public ObservableSource<?> apply(@NonNull RequestResult requestResult) throws Exception {
// map each requestResult into this observable and perform a new stream
return Observable
.defer(new Callable<ObservableSource<?>>() {
// return a postponed observable for each subscriber
})
.retryWhen(new Function<Observable<Throwable>, ObservableSource<?>>() {
// return throwable observable
})
}
})
.subscribe(new Observer<ObservableSource<?>>() {
//.. onSubscribe {}
//.. onError {}
//.. onComplete {}
@Override
public void onNext(ObservableSource<?> observableSource) {
// actual subscription for each of the Observable.defer inside
// so it will start to emit and perform the necessary operation
}
});
但问题是,它执行Observable.defer源,只有 ONCE ,但继续迭代(通过在地图运算符中放置一个Log来查看迭代)。
任何人都可以指导我,我怎样才能实现我想要的东西,我耗尽了大量的论文,绘制了大量的大理石图,只是为了看看我的代码在哪里,
我不知道我创建的图表是否说明了我想要的东西,如果是的话,我不知道为什么示例代码不会像图片肖像那样执行
非常感谢任何帮助。
答案 0 :(得分:0)
第一部分很好,但地图有点不需要,你正在做的是将每个RequestResult
映射到Observable
,然后在Observer.onNext()
手动订阅它实际上,defer
不是必需的,因为您为每个Observable
创建了具有不同数据的单独RequestResult
,defer
将在每个订阅时发生{ {1}},地图会在您对每个压缩onNext()
的发射时观察到。
您可能需要的是简单RequestResult
将每个flatMap()
值映射到将执行网络请求的单独RequestResult
,并且它会将每个请求的结果合并回流,因此您只需要处理每个请求的最终值排放,而不是手动订阅每个Observable
。
请记住,订单可能会丢失,以防某些请求可能需要的时间超过它们之间的延迟。
Observable
答案 1 :(得分:0)
我设法让它工作,就像在Observable.defer中的某个地方,我的改装是null,
retrofitClient.getApiURL().post(request); // client was null
我的retrofitClient为null(我看了代码中的某处,我注意到我没有初始化,我正确地初始化它并使其工作)
现在有人可以告诉我为什么Rx没有将异常抛回到原始的可观察流中吗?没有发生NullPointerException,我很困惑