2015-04-30 16 views
12

Bizim app Bu kod ile bir görüntü dosyası indirmek. UI'de indirme ilerlemesini (indirilmiş bayt yüzdesi) göstermem gerekiyor. Bu kodda indirme ilerlemesini nasıl alabilirim? Çözüm aradım ama yine de kendi başıma yapamıyorum.Android'de RxJava, OkHttp ve Okio ile indirme ilerlemesini

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

sorumu http://danosipov.com/?p=678 ben cevabımı güncellenmiş ama bu yüzden can Okio bilmiyorum yüzdesi –

cevap

19

Bu, ilerlemeyi görüntülemek için ne yapardım.

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

Tam soyut yöntemlere sahip olan Aboneyi kullanın.

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

ilişkin iyi bir örnek bulundu Bu konuda bir şey söylemedim –

+2

yılında indirilen ilerleme göstermesi gerektiği anlamına – inmyth

+0

Bir çekicilik gibi çalıştım. Ben retrofit kullanıyorum ve basit bir dosya indirmek için oldukça karmaşık hale geliyordu. –