Retrofit和rxjava请求图片

Retrofit和rxjava请求图片

有这么一个接口,返回的是一张图片,图片传输的时候其实是字节数组的形式,这里就不能用json来解析了,用到rxjava的一个功能.

  1. 先定义接口,要注意get请求,下载图片配合@Streaming使用
/**
     * 获取二维码
     * @return
     */
    @Headers("Content-Type:image/png; charset=utf-8")
    @GET("img/ImageQR")
    @Streaming//下载文件需指定
    Observable<ResponseBody> getImage();
  1. 请求代码
    //发送请求,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();
    }
  1. 用到rxjava的知识,参考rxjava
  2. 本文参考利用Retrofit2.0+RxJava2.0实现网络下载图片保存到本地SD卡

你可能感兴趣的:(学习日志)