Retrofit和rxjava请求图片
Retrofit和rxjava请求图片
有这么一个接口,返回的是一张图片,图片传输的时候其实是字节数组的形式,这里就不能用json来解析了,用到rxjava的一个功能.
- 先定义接口,要注意get请求,下载图片配合@Streaming使用
/**
* 获取二维码
* @return
*/
@Headers("Content-Type:image/png; charset=utf-8")
@GET("img/ImageQR")
@Streaming//下载文件需指定
Observable<ResponseBody> getImage();
- 请求代码
//发送请求,get二维码
Bitmap bitmap = null;
private void downLoadImg() {
new Thread(new Runnable() {
@Override
public void run() {
//OK设置请求超时时间,读取超时时间
OkHttpClient client = new OkHttpClient.Builder()
.connectTimeout(15, TimeUnit.SECONDS)
.readTimeout(15, TimeUnit.SECONDS)
.build();
Retrofit retrofit = new Retrofit.Builder().baseUrl(RequestInterface.HOST)
.addConverterFactory(GsonConverterFactory.create())
.client(client)
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
RequestInterface apiService = retrofit.create(RequestInterface.class);//接口实现,映射自动创建
Observable<ResponseBody> observable = apiService.getImage();//观察者模式,这是rxjava的类
observable.subscribeOn(Schedulers.io())
.subscribe(new Observer<ResponseBody>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(ResponseBody value) {
byte[] data = new byte[0];
try {
data = value.bytes(); //注意:把byte[]转换为bitmap时,也是耗时操作,也必须在子线程
bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
runOnUiThread(new Runnable() {//开启主线程更新UI
@Override
public void run() {
//设置图片到imageview
imageView.setImageBitmap(bitmap);
}
});
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
}
}).start();
}
- 用到rxjava的知识,参考rxjava
- 本文参考利用Retrofit2.0+RxJava2.0实现网络下载图片保存到本地SD卡