在Android中使用RxJava,OkHttp和Okio下载进度

前端之家收集整理的这篇文章主要介绍了在Android中使用RxJava,OkHttp和Okio下载进度前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在我们的应用程序中,我使用此代码下载一个图像文件我需要在UI上显示下载进度(以百分比形式下载的字节数).如何在这段代码中获得下载进度?我搜索解决方案,但仍然无法自行设法完成.
  1. Observable<String> downloadObservable = Observable.create(
  2. sub -> {
  3. Request request = new Request.Builder()
  4. .url(media.getMediaUrl())
  5. .build();
  6. Response response = null;
  7. try {
  8. response = http_client.newCall(request).execute();
  9. if (response.isSuccessful()) {
  10. Log.d(TAG,"response.isSuccessful()");
  11. String mimeType = MimeTypeMap.getFileExtensionFromUrl(media.getMediaUrl());
  12. File file = new File(helper.getTmpFolder() + "/" + helper.generateUniqueName() + "test." + mimeType);
  13. BufferedSink sink = Okio.buffer(Okio.sink(file));
  14. sink.writeAll(response.body().source());
  15. sink.close();
  16. sub.onNext(response.toString());
  17. sub.onCompleted();
  18. } else {
  19. sub.onError(new IOException());
  20. }
  21. } catch (IOException e) {
  22. e.printStackTrace();
  23. }
  24.  
  25. }
  26. );
  27.  
  28. Subscriber<String> mySubscriber = new Subscriber<String>() {
  29. @Override
  30. public void onNext(String responseString) {
  31. Log.d(TAG,"works: " + responseString);
  32. }
  33. };
  34. downloadObservable
  35. .subscribeOn(Schedulers.newThread())
  36. .observeOn(AndroidSchedulers.mainThread())
  37. .subscribe(mySubscriber);

解决方法

这是我会做的以显示进度.
  1. Observable<String> downloadObservable = Observable.create(
  2. sub -> {
  3. InputStream input = null;
  4. OutputStream output = null;
  5. try {
  6. Response response = http_client.newCall(request).execute();
  7. if (response.isSuccessful()) {
  8. input = response.body().byteStream();
  9. long tlength= response.body().contentLength();
  10.  
  11. output = new FileOutputStream("/pathtofile");
  12. byte data[] = new byte[1024];
  13.  
  14. sub.onNext("0%");
  15. long total = 0;
  16. int count;
  17. while ((count = input.read(data)) != -1) {
  18. total += count;
  19.  
  20. sub.onNext(String.valueOf(total*100/tlength) + "%");
  21.  
  22. output.write(data,count);
  23. }
  24. output.flush();
  25. output.close();
  26. input.close();
  27. }
  28. } catch(IOException e){
  29. sub.onError(e);
  30. } finally {
  31. if (input != null){
  32. try {
  33. input.close();
  34. }catch(IOException ioe){}
  35. }
  36. if (out != null){
  37. try{
  38. output.close();
  39. }catch (IOException e){}
  40. }
  41. }
  42. sub.onCompleted();
  43. }
  44. );

并使用具有完整抽象方法订阅者.

  1. Subscriber<String> mySubscriber = new Subscriber<String>() {
  2.  
  3. @Override
  4. public void onCompleted() {
  5. // hide progress bar
  6. }
  7.  
  8. @Override
  9. public void onError(Throwable e) {
  10. // hide progress bar
  11. }
  12.  
  13. @Override
  14. public void onNext(String percentProgress) {
  15. // show percentage progress
  16. }
  17. };

猜你在找的Android相关文章