2015-04-30 18 views
12

Nella nostra app, scarica un file di immagine con questo codice. Ho bisogno di mostrare i progressi del download (byte scaricati in percentuale) sull'interfaccia utente. Come posso scaricare i progressi in questo codice? Ho cercato una soluzione, ma non riesco ancora a farlo da solo.Scaricare i progressi con RxJava, OkHttp e Okio in Android

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); 
+0

trovato buon esempio legati alla mia domanda http://danosipov.com/?p=678 –

risposta

19

Questo è quello che farei per visualizzare i progressi.

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(); 
    } 
); 

E utilizzare l'Abbonato che ha i metodi astratti completi.

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 
} 
}; 
+0

voglio dire ho bisogno di mostrare i progressi scaricabili in percentuale –

+2

Ho aggiornato la mia risposta, ma non so Okio così posso ne parliamo – inmyth

+0

Ha funzionato come un incantesimo. Sto usando il retrofit e stava diventando piuttosto complesso scaricare un semplice file. –