网络请求篇--RXJava+okhttp 进行网络下载操作
2017-07-25 11:17
357 查看
下载文件(实时返回下载进度)转载 http://www.jianshu.com/p/b084b6d91260
RxJava中的事件源(被观察者):这里配合OkHttp进行进行网络操作,File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES); File file = new File(path,"/okhttpdownload"); /** * download file with OkHttp and RxJava (rate) */ Observable<String> downloadObservable = Observable.create(new Observable.OnSubscribe<String>() { @Override public void call(Subscriber<? super String> subscriber) { InputStream inputStream = null; OutputStream outputStream = null; OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder() .url("Https://xxxx.txt") .build(); try{ Response response = client.newCall(request).execute(); if (response.isSuccessful()){ inputStream = response.body().byteStream(); long length = response.body().contentLength(); //将文件下载到file路径下 outputStream = new FileOutputStream(file); byte data[] = new byte[1024]; subscriber.onNext("0%"); long total = 0; int count; while ((count = inputStream.read(data)) != -1){ total += count; // 返回当前实时进度 subscriber.onNext(String.valueOf(total*100/length) + "%"); outputStream.write(data,0,count); } outputStream.flush(); outputStream.close(); inputStream.close(); } }catch (IOException e){ //告诉订阅者错误信息 subscriber.onError(e); }finally { if (inputStream != null){ try{ inputStream.close(); }catch (IOException e){} } if (outputStream != null){ try { outputStream.close(); }catch (IOException e){} } } //告诉订阅者请求数据结束 subscriber.onCompleted(); });
事件源写好后,就要开始使用RxJava订阅事件了;
downloadobservable.subscribeOn(Schedulers.io()) .onBackpressureBuffer() .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Subscriber<String>() { @Override public void onCompleted() { //接收到事件源的onCompleted后的操作 //一般是取消downloading dialog的操作 } @Override public void onError(Throwable e) { //接收事件源的错误信息操作 log.e(e.toString()); } @Override public void onNext(String s) { // 接受实时的下载进度 log.d(s); } });
我认为RxJava中,设计最精妙的就是 .subscribeOn() 和 .observeOn()两个操作了,它可以轻而易举的实现Android中主线程和IO线程的切换,从而让我们可以完全抛弃Handler和AsyncTask。
下载Bitmap图片
虽然Square专门出了一款图片处理的开源库Picasso(下一篇会介绍到),但是如果想要用OkHttp配合RxJava下载图片并现实该怎么做呢?还是通过RxJava的框架来实现:
Observable<Bitmap> downloadDrawble = Observable.create(new Observable.OnSubscribe<Bitmap>() { @Override public void call(Subscriber<? super Bitmap> subscriber) { OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder() .url(url) .build(); try { Response response = client.newCall(request).execute(); if (response.isSuccessful()){ InputStream input = response.body().byteStream(); Bitmap bitmap = BitmapFactory.decodeStream(input); subscriber.onNext(bitmap); } }catch (IOException e){ subscriber.onError(e); } subscriber.onCompleted(); } });
其实下载图片这里和上面的文件下载大致无二,只是将inputstream转换成bitmap的格式。这里没有将文件下载到本地,而是下载到内存中,应用关闭后会清除数据。事件的订阅和上文一样,可以在onNext()中更新UI,这里会回调到主线程。
作者:Torang
链接:http://www.jianshu.com/p/b084b6d91260
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
相关文章推荐
- Android 快速使用RxJava + OkHttp 进行网络请求
- 使用okhttp进行图片下载,上传,get,post网络请求
- 【封装】使用okHttp发送网络请求及上传下载进度监听
- RxJava+Retrofit+OkHttp请求网络数据
- RetrolFit+rxjava + okHttp与服务 交互的例子+取消retrolfit网络请求
- [置顶] Android Kotlin 开发--偶遇Rxjava、Retrofit进行网络请求
- 通过c#进行网络文件的检查并进行下载操作
- Android网络请求发展简史和RxJava+Retrofit+OkHttp实践
- Android 单例模式 封装 Okhttp + RxJava 网络请求(get和post)
- 网络请求工具类之OkHttp3封装(支持缓存、日志、拦截器、断点下载、上传等)
- android中Okhttp框架进行网络请求的工具类()
- Android okHttp 实战(二):okHttp网络请求之文件上传下载
- android 开发使用okhttp进行网络请求简单介绍(未测试)
- RxJava+Retrofit+OkHttp深入浅出-终极封装二(网络请求)
- 对OkHttp进行封装,实现了只查询缓存,网络请求失败自动查询本地缓存等功能
- android中使用Okhttp进行网络请求的工具类(二)
- 网络请求框架 Rxjava+ReTrofit+okHttp+MVP
- iOS网络开发:多个异步网络请求结束后再进行某些操作的方法
- 利用AsyncTask进行网络操作之下载HTML
- android 网络请求Retrofit+rxjava+okhttp 轻封装