Retrofit+Rxjava实现文件上传和下载功能
retrofit简介:
在android api4.4之后,google官方使用了square公司推出的okhttp替换了httpclient的请求方式。后来square公司又推出了基于okhttp的网络请求框架:retrofit。
什么是 rxjava?
rxjava 是一个响应式编程框架,采用观察者设计模式。所以自然少不了 observable 和 subscriber 这两个东东了。
rxjava 是一个开源项目,地址:https://github.com/reactivex/rxjava
还有一个rxandroid,用于 android 开发,添加了 android 用的接口。地址:https://github.com/reactivex/rxandroid
每个应用基本都会涉及到文件的上传或下载,最普遍的一般也就是上传头像或者照片,下载安装包了,本篇文章就这两点简单说一下retrofit+rxjava的对文件的上传和下载。
1.上传
首先说一下单文件上传,一般上传头像等会用到 .
1).写api @multipart
@post
( "" )//引号内为地址observable httpname(@partmultipartbody.part file);
2).写presenter的方法
public void httpname(file file) { requestbody requestbody = requestbody. create (mediatype. parse ( "image/png" ), file); multipartbody.part part = multipartbody.part. createformdata ( "file" , file.getname() , requestbody); observable observable = api. httpname (part); …rajava+retrofit处理逻辑 }
3)调用方法发起请求
mpresenter. httpname (f);
其中f我为你要上传的文件对象
以图片为例,经过裁剪后将其转化为文件对象方法如下
@override protected void onactivityresult(int requestcode, int resultcode, intent data) { if (data != null) { bundle bundle = data.getextras(); if (bundle != null) { bitmap = bundle.getparcelable("data"); file f = new file(this.getfilesdir(), (new date()).gettime() + ".png"); if (f.exists()) {f.delete();} try { fileoutputstream out = new fileoutputstream(f); bitmap.compress(bitmap.compressformat.png, 90, out); out.flush(); out.close(); } catch (filenotfoundexception e) { e.printstacktrace(); f = null; } catch (ioexception e) { e.printstacktrace(); f = null; } if (f != null) { mpresenter. httpname(f); }}}//括号可能多或者少,自己添吧
再说一下多文件上传,以及附带有参数的请求,类似这样
mpresenter.httpuploadmore(id,phone, file1, file2, file3); @multipart @post("") observable<responsebody> httpuploadmore (@query("id") string id, @query("phone") string phone, @part multipartbody.part file1, @part multipartbody.part file2, @part multipartbody.part file3);
这里附带参数用@fieldmap map maps也可以,用query好像不太恰当
后面只需要像传单文件一样
requestbody requestbody1/2/3 = requestbody.create(mediatype.parse("image/png"), file1/2/3);; multipartbody.part part1/2/3 = multipartbody.part.createformdata("file", file1/2/3.getname() , requestbody1/2/3); observable bservable= api.httpuploadmore(id,phone,part1,part2,part3); ……
2下载
1)写api
@streaming//下载大文件时需要加上 @get observable > download(@url string url);
2)presenter方法
mapi.download (path) .subscribeon(schedulers.io()) .observeon(schedulers.io()) .flatmap(new func1,observable>() { @override public observablecall(response response) { boolean b = writetofile(response, file);//将返回的流转写入到file对象中 final boolean aboolean =boolean.valueof(b); return observable.create(new observable.onsubscribe(){ @override public void call(subscriber subscriber) { try { subscriber.onnext(aboolean); subscriber.oncompleted(); } catch (exceptione) { subscriber.onerror(exceptionmanager.handleexception(e));}}});}}) .observeon(androidschedulers.mainthread()) .subscribe(new action1(){ @override public void call(boolean bean) {} }, new action1(){ @override public void call(throwablethrowable) {}}); [if !supportlinebreaknewline] [endif] private boolean writetofile(responsebody,file file) { try { inputstream inputstream = null; outputstream outputstream = null; try { byte[] filereader = new byte[2048]; inputstream =body.body().bytestream(); outputstream = new fileoutputstream(file); while (true) { int read =inputstream.read(filereader); if (read == -1) break; outputstream.write(filereader, 0, read); } outputstream.flush(); return true; } catch (ioexception e) { return false; } finally { if (inputstream != null) { inputstream.close(); } if (outputstream != null) { outputstream.close(); }} } catch (ioexception e) { return false; }}
3)调用方法发起下载请求
mpresenter.httptodownload(downpath, file);//file为你下载下来的文件要存放的位置
因本人app中用的是rxjava1,所以一些rxjava+retrofit处理逻辑写的不细甚至有些乱,所以大家可以自己作相应修改,不要拿来就用.
总结
以上所述是小编给大家介绍的retrofit+rxjava实现文件上传和下载功能,希望对大家有所帮助