私はRxJavaを初めて使うので、複数のファイルを同時にflatMapでダウンロードするためにRxJavaをRetrofitで実装しました。私は、個々のダウンロードのonCompleteステータスを正常に受信しています。しかし、完成度ステータスがの場合、機能を実装することができません。すべてダウンロードしてください。私はURL情報を受け取るどこforループの回数内downloadFile(String url, final File parentFolder
を呼び出すRxAndroid:個々の操作が完了したときだけでなく、完了したときにわかる
private void downloadFile(String url, final File parentFolder) {
final Uri uri = Uri.parse(url);
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(url.replace(uri.getLastPathSegment(),""))
.client(new OkHttpClient.Builder().build())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create()).build();
RestApi restApi = retrofit.create(RestApi.class);
restApi.downloadFile(url)
.flatMap(new Func1<Response<ResponseBody>, Observable<File>>() {
@Override
public Observable<File> call(final Response<ResponseBody> responseBodyResponse) {
return Observable.fromCallable(new Callable<File>() {
@Override
public File call() throws Exception {
File file = new File(parentFolder.getAbsoluteFile(), uri.getLastPathSegment());
if (!file.exists()) {
file.createNewFile();
BufferedSink sink = Okio.buffer(Okio.sink(file));
sink.writeAll(responseBodyResponse.body().source());
sink.close();
}
return file;
}
});
}
},3)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<File>() {
@Override
public void onCompleted() {
dManager.logMe(TAG,"file download complete");
}
@Override
public void onError(Throwable e) {
dManager.logMe(TAG,"file download error");
e.printStackTrace();
}
@Override
public void onNext(File file) {
dManager.logMe(TAG,"file download onNext: " + file.getAbsolutePath());
}
});
}
:
以下は、私は複数のダウンロードのために使用しています私のコードです。 ありがとうございました。あなたはURLのList<String>
を持っていると仮定すると
です。 –
ここでは、一度に1つのファイルしかダウンロードしていないことがわかりました。 'List'をお持ちの場合は、 'Observable.from()'を使って各項目を繰り返し処理してください。ダウンロードすると、 'List 'の 'onComplete()'をよく知ることができます。それぞれの 'url'のsecomplete' onComplete() 'を取得します。 'Observable.create()'の代わりに 'fromCallable'を使用してください。 –
@AkbarShaEbrahim - 私は個々の操作についてもonCompleteを処理する必要があるため、Single Operationsを実装しました。Observable.from()はすべてが完了したときにのみステータスを返すと推測しています。 –