主要POJO:
class VideoResponse{
List<VideoFiles> videosFiles;
}
在以下情况下,我合并了两个数据库操作的结果,并以 Observable(List(VideoResponse))返回。
##更新##
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());
});
下面是正在执行的调度程序线程:
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
最终的 onNext 永远不会执行。我需要在OnNext中返回 List 。 我已经将 observeOn 放在了不同的位置,似乎没有任何效果.. !!有什么建议。
##更新## 使用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);
}
答案 0 :(得分:0)
正如@BobDalgleish所暗示的那样, OnComplete 在toList之前而不是在 ZipWith 之后被调用。现在,我进行了以下更改,并获得了完整列表从数据库。我已使用 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());
}
});
我知道这看起来很乱!!。任何建议或优化,请发表.. !!