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);
- ¿Cómo ignorar el error y continuar la corriente infinita?
- Robolectric + OkHttp + retrofit + prueba de unidad rxJava
- RxJava / Android: Combina el resultado de dos dependientes dependientes
- RxJava: Cómo aplicar condicionalmente a los operadores a un observable sin romper la cadena
- Android Rxjava suscribirse a un cambio de variable
- MVP de Android con RxAndroid + Retrofit
- Escritura de pruebas síncronas para Rx v2 Flowable
- Añadir RxJava Observer en cadena dependiendo de una condición
- Desbordamiento de pila al utilizar Retrofit rxjava concatWith
- Android - RxJava vs AsyncTask para evitar la pérdida de memoria de getActivity ()
- Okhttp ignora la configuración de Dispatcher cuando se usa con Retrofit RxJavaCallAdapterFactory
- RxJava: encadenamiento de observables
- Manejador de errores por defecto de RxJava
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 } };