欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2023-12-17 20:56:10
retrofit简介: 在android api4.4之后,google官方使用了square公司推出的okhttp替换了httpclient的请求方式。后来square...

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

上一篇:

下一篇: