2017-01-04 17 views
0

私は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>を持っていると仮定すると

+0

です。 –

+0

ここでは、一度に1つのファイルしかダウンロードしていないことがわかりました。 'List 'をお持ちの場合は、 'Observable.from()'を使って各項目を繰り返し処理してください。ダウンロードすると、 'List 'の 'onComplete()'をよく知ることができます。それぞれの 'url'のsecomplete' onComplete() 'を取得します。 'Observable.create()'の代わりに 'fromCallable'を使用してください。 –

+0

@AkbarShaEbrahim - 私は個々の操作についてもonCompleteを処理する必要があるため、Single Operationsを実装しました。Observable.from()はすべてが完了したときにのみステータスを返すと推測しています。 –

答えて

0

Observable.from(urls) 
      .flatMap(url -> restApi.downloadFile(url)) 
      .concatMap(new Func1<Response<ResponseBody>, Observable<File>>() { 
       @Override 
       public Observable<File> call(final Response<ResponseBody> responseBodyResponse) { 
        try { 
         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 Observable.just(file); 
        } catch (Exception e) { 
         return Observable.error(e); 
        } 
       } 
      }) 
      .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()); 
       } 
      }); 
+0

説明できますか?これはどうですか?ダウンロード完了ステータスはどこで手に入りますか? –

+0

あなたはonNextコールの各ファイルのダウンロード完了ステータスを受信し、onCompletedのすべてのURLのダウンロード完了を受け取ります。 –

+0

さて、私は明日あなたを更新します。あなたの努力に感謝します –

0

ここでは、リスト を渡し、結果を組み合わせることジップ演算子を使用することができますスクラッチ例

Observable.from(List <Url>) 
       .flatMap(Observable.fromCallable(downloadImageHereAndReturnTheFile()) 
         .observeOn(AndroidSchedulers.mainThread()) 
         // Do on next is where you get notified when each url is getting downloaded 
         .doOnNext(doTheUIOperationHere()) 
         .observeOn(Schedulers.io()) //Switch to background thread if you want, in case if you do some other background task otherwise remove the above this and the following next operator 
         .doOnNext(DoSomeOtherOperationHere())) 
       .observeOn(AndroidSchedulers.mainThread()) 
       .subscribeOn(Schedulers.io()) 
       .subscribe(new Subscriber<R>() { 
        @Override 
        public void onCompleted() { 
         Log.d(TAG, "The entire process of downloading all the image completed here"); 
        } 

        @Override 
        public void onError(Throwable e) { 

        } 

        @Override 
        public void onNext(R r) { 
         Log.d(TAG, "You receive the file for each url"); 
        } 
       }); 
+0

ねえ、ありがとう、私は明日あなたを更新します.. –

関連する問題