【发布时间】:2018-09-07 15:54:02
【问题描述】:
我已经使用 RxJava2 在 MVP 中实现了一个存储库模式
RemoteDataSource.java
public Observable<List<A>> getAList(){
return ApiService.
getAList()
.compose(RxUtils.applySchedulers())
.doOnSubscribe(disposable -> Timber.d(..))
.doOnError(throwable -> Timber.d(..))
.doOnComplete(() -> {
Timber.d(..);
});
}
LocalDataSource.java
public Observable<List<A>> getAList(){
return mDbHelper .....from SQLBrite..
}
public void saveAList(List<<A> a){
SQlBriteTransaction...
}
Repository.java(更新)
@Inject
public Repository(DownloadUtils downloadUtils){
this.mDownloadUtils = downloadUtils;
}
@Override
public Observable<List<A>> getAList(){
return mRemoteDataSource
.getAList()
.flatMapIterable(List<A> -> a)
.flatMap(A a ->
************************************************************
return Observable.fromIterable(a.getB())
.flatMap((Function<B, ObservableSource<B>>) b ->
Observable.create(emitter ->
emitter.onNext(new
DownloadUtils().downloadFiles(b,totalListCount,emitter))))
.toList()
.toObservable()
***************************************************
.toList()
.toObservable()
.doOnNext( List<A> a -> {
--------------Only the first change in B value is inserted in Db-
mLocalDataSource.saveAList(a);
});
}
DownLoadUtils.java(更新)
void downloadBFiles(B b, int totalCount,ObservableEmitter<B> emitter){
fileCount = b.size;
b.get(index).setDataToChange(dataToChange);
*** I am using PR Downloader for aynchronous download using
RECURSION **
PRDownloader.download(remoteUrl, filePath, fileName)
.build()
.setOnStartOrResumeListener(() -> {
})
.setOnProgressListener(progress -> {
int progressPercent = (int) (progress.currentBytes *
100 / progress.totalBytes);,
})
.start(new OnDownloadListener() {
@Override
public void onDownloadComplete() {
********************* emitter.onComplete() ******************
@Override
public void onError(Error error) {
}
}
Presenter.java
void getVideosFromRepo(){
disposable = mRepository
.getAList()
.doOnSubscribe(d _-> "Started Loading")
.subscribe(
//OnNext
------------- Here the OnNext is being called before Asynchronous Operation completes!!-------
List<A> a -> mView.setAList(a);
)
}
在演示者实现之上,甚至在异步下载完成之前返回 Presenter 的 onNext 中的列表...需要进行哪些更改,以便 onNext(subscribe) 是在所有下载完成后调用完成。!!!
【问题讨论】:
标签: android rx-java rx-java2 dagger-2 android-mvp