Progreso de descarga con RxJava, OkHttp y Okio en Android

En nuestra aplicación, descargo un archivo de imagen con este código. Necesito mostrar el progreso de la descarga ( bytes descargados en porcentaje ) en la interfaz de usuario. ¿Cómo puedo obtener progreso de descarga en este código? He buscado una solución, pero todavía no puedo lograr hacerlo por mi cuenta.

Observable<String> downloadObservable = Observable.create( sub -> { Request request = new Request.Builder() .url(media.getMediaUrl()) .build(); Response response = null; try { response = http_client.newCall(request).execute(); if (response.isSuccessful()) { Log.d(TAG, "response.isSuccessful()"); String mimeType = MimeTypeMap.getFileExtensionFromUrl(media.getMediaUrl()); File file = new File(helper.getTmpFolder() + "/" + helper.generateUniqueName() + "test." + mimeType); BufferedSink sink = Okio.buffer(Okio.sink(file)); sink.writeAll(response.body().source()); sink.close(); sub.onNext(response.toString()); sub.onCompleted(); } else { sub.onError(new IOException()); } } catch (IOException e) { e.printStackTrace(); } } ); Subscriber<String> mySubscriber = new Subscriber<String>() { @Override public void onNext(String responseString) { Log.d(TAG, "works: " + responseString); } }; downloadObservable .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(mySubscriber); 

Esto es lo que haría para mostrar el progreso.

 Observable<String> downloadObservable = Observable.create( sub -> { InputStream input = null; OutputStream output = null; try { Response response = http_client.newCall(request).execute(); if (response.isSuccessful()) { input = response.body().byteStream(); long tlength= response.body().contentLength(); output = new FileOutputStream("/pathtofile"); byte data[] = new byte[1024]; sub.onNext("0%"); long total = 0; int count; while ((count = input.read(data)) != -1) { total += count; sub.onNext(String.valueOf(total*100/tlength) + "%"); output.write(data, 0, count); } output.flush(); output.close(); input.close(); } } catch(IOException e){ sub.onError(e); } finally { if (input != null){ try { input.close(); }catch(IOException ioe){} } if (out != null){ try{ output.close(); }catch (IOException e){} } } sub.onCompleted(); } ); 

Y utilizar el suscriptor que tiene los métodos abstractos completos.

 Subscriber<String> mySubscriber = new Subscriber<String>() { @Override public void onCompleted() { // hide progress bar } @Override public void onError(Throwable e) { // hide progress bar } @Override public void onNext(String percentProgress) { // show percentage progress } }; 
  • Encadenar dos observables de adaptación con RxJava
  • RxJava dividir uno Observable a dos subObservables
  • Cómo utilizar CompositeDisposable de RxJava 2?
  • Compruebe que el método se llama en onNext del suscriptor de RxJava
  • RxJava solo planificador de hilos de fondo
  • RxJava + retrofit, obtenga una lista y agregue información adicional para cada artículo
  • NetworkOnMainThreadException con retrofit-beta2 y rxjava
  • RxJava Observable.cache invalidate
  • Manera eficiente de manipular los subprocesos RxJava
  • Prueba Espresso con RxLoader
  • Robolectric Test no llama a textWatcher.onTextChanged
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.