当前位置: 移动技术网 > IT编程>开发语言>Java > Retrofit+Rxjava实现文件上传和下载功能

Retrofit+Rxjava实现文件上传和下载功能

2019年07月19日  | 移动技术网IT编程  | 我要评论

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实现文件上传和下载功能,希望对大家有所帮助

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网