android - onNext of the Subscribe method not emitting items after using the ZIP WITH operator in RxJava?
问题描述
Main POJO:
class VideoResponse{
List<VideoFiles> videosFiles;
}
I have the following case where i combine the results from two database operation and return as Observable(List(VideoResponse)) .
##Update##
mDbHelper
===/* getVideoCategory() returns Observable<List<VideoResponse>> */=========
.getVideoCategory()
.flatMapIterable(videoResponses -> videoResponses)
.doOnNext(videoResponse -> {
Timber.d("Flatmap Iterable Thread == > %s", Thread.currentThread().getName());})
.concatMap((Function<VideoResponse, ObservableSource<VideoResponse>>) videoResponse -> {
Integer videoId = videoResponse.getId();
return Observable.fromCallable(() -> videoResponse)
.doOnNext(videoResponse1 -> {
Timber.d("Thread before ZIP WITH ===>
%s", Thread.currentThread().getName());
})
===/* getVideoFileList(int videoId) returns Observable<List<VideoFiles>> */====
.zipWith(getVideoFilesList(videoId)),
(videoResponse1, videoFiles) -> {
videoResponse1.setFiles(videoFiles);
return videoResponse1;
})
.doOnNext(vResponse -> {
Timber.d("Thread After ZIP WITH ===>
%s",Thread.currentThread().getName());
})
======= /*This Gets printed*/ ======================
.doOnComplete(()->{
Timber.d(" OnComplete Thread for Video Files ===> %s ",Thread.currentThread().getName());
});
})
.toList()
.toObservable()
===/* Below Print statement is not getting Executed */=================
.doOnComplete(()->{
Timber.d(" Thread doOnComplete");
})
.doOnNext(videoResponses -> {
Timber.d("Thread after loading from the LOCAL DB ====> %s", Thread.currentThread().getName());
});
Below are the scheduler threads being executed:
Flatmap Iterable Thread == > RxCachedThreadScheduler-1
Thread before ZIP WITH ===> RxCachedThreadScheduler-1
Flatmap Iterable Thread == > RxCachedThreadScheduler-1
Thread After ZIP WITH ===> RxCachedThreadScheduler-2
Thread before ZIP WITH ===> RxCachedThreadScheduler-2
Thread After ZIP WITH ===> RxCachedThreadScheduler-2
The final onNext is never getting executed.I need to return the List in the OnNext. I have placed observeOn on different positions ,nothing seems to work..!! Any suggestions..
##Update## Using SqlBrite,
@Override
public Observable<List<VideoResponse>> getVideoCategory() {
return mDBHelper
.createQuery(VideoEntry.TABLE_NAME,
DbUtils.getSelectAllQuery(VideoEntry.TABLE_NAME))
.mapToOne(DbUtils::videosFromCursor);
@Override
public Observable<List<VideoFiles>> getVideoFilesList(int videoId) {
return mDBHelper.createQuery(VideoDetailsEntry.TABLE_NAME,
DbUtils.getSelectFromId(VideoDetailsEntry.TABLE_NAME,VideoDetailsEntry.COLUMN_VIDEO_ID),
String.valueOf(videoId))
.mapToOne(DbUtils::videoDetailsFromCursor);
}
解决方案
正如@BobDalgleish 所暗示的那样,在toList 之前而不是在ZipWith之后调用OnComplete。现在我进行了以下更改,并且我从 db 获得了完整列表。我使用concatMap来保留订单并等待完成。
mLocalDataSource
.getVideoCategory()
.compose(RxUtils.applySchedulers())
.flatMap(new Function<List<VideoResponse>,
ObservableSource<List<VideoResponse>>>() {
@Override
public ObservableSource<List<VideoResponse>> apply(List<VideoResponse> videoResponses) throws Exception {
return Observable.just(videoResponses)
.concatMap(videoResponses1 -> Observable.fromIterable(videoResponses1)
.concatMap(videoResponse -> Observable.just(videoResponse)
.concatMap(videoResponse1 -> {
Integer videoId = videoResponse1.getId();
return Observable.just(videoResponse1)
.zipWith(getVideoFilesList(videoId), new BiFunction<VideoResponse, List<VideoFiles>, VideoResponse>() {
@Override
public VideoResponse apply(VideoResponse videoResponse1, List<VideoFiles> videoFiles) throws Exception {
videoResponse1.setFiles(videoFiles);
Timber.d("Video Responses == > %s",videoResponse1);
return videoResponse1;
}
});
})))
.toList()
.toObservable()
.observeOn(AndroidSchedulers.mainThread());
}
});
我知道这看起来有点乱!!任何建议或优化,请张贴..!!
推荐阅读
- assembly - 我可以在不使用 jal 的情况下在汇编中调用递归函数吗?
- python-3.x - AWS Sagemaker KeyError:调整超参数时出现“SM_CHANNEL_TRAINING”
- javascript - 基于类的组件的方法中的陈旧道具
- node.js - React/Express 应用程序只加载根路由,否则加载为 JSON
- azure - 使用订阅工厂 Rest API 创建 Azure 订阅时无法添加标签
- python - 我面临这个错误;; AttributeError:模块“numpy”没有属性“corroef”
- javascript - 可以访问 HTML 表单外部但不能访问内部的 DOM 元素。不知道为什么
- r - 在不平衡设计中基于多个变量计算数据的均值和 se
- vue.js - Nuxt URL.createObjectURL 不是函数
- twitter-bootstrap - 引导行 - 2 列(文本右,图像左) - 需要图像正确填充左列并做出响应?