Rxjava2,Retrofit2,将图像下载为字节数组

时间:2017-08-20 13:17:26

标签: java android arrays retrofit rx-java2

我尝试从网址中下载多张图片。在我将byte []解码为位图并将其设置为ImageView之后。这段代码非常完美。

Request request = new Request.Builder()
                            .url(imageUrl)
                            .build();

                    new OkHttpClient().newCall(request).enqueue(new Callback() {
                        @Override
                        public void onFailure(Call call, IOException e) {}

                        @Override
                        public void onResponse(Call call, Response response) throws IOException {
                            try {
                                ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
                                int current;
                                while ((current = response.body().byteStream().read()) != -1) {
                                    outputStream.write((byte) current);
                                }
                                byte[] array = outputStream.toByteArray();
                                ..........
                            }
                        }
                    });

但是如果我使用rxjava2和retrofit2它就不行了。字节数组有很多0值。

public interface ImageApi {

@GET
Observable<ResponseBody> requestImage(@Url String utl);}



Observable(imageUrl()).subscribe(new Observer<ResponseBody>() {
                        @Override
                        public void onSubscribe(@NonNull Disposable d) {}

                        @Override
                        public void onNext(@NonNull ResponseBody responseBody) {
                            try {
                                if (responseBody != null && responseBody.bytes() != null) {
                                    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
                                    int current;
                                    while ((current = responseBody.byteStream().read()) != -1) {
                                        outputStream.write((byte) current);
                                    }
                                    byte[] array = outputStream.toByteArray(); 
                                }
                        }

我做错了什么? OkHttpClient请求和Retrofit2有什么区别?

P.S。我不需要使用Glide或Picasso。

1 个答案:

答案 0 :(得分:0)

responseBody.bytes() != null - 对bytes()的调用会读取整个流,然后关闭响应。之后尝试访问responseBody.byteStream()始终返回一个封闭的流。

正确的代码是:

byte[] array = responseBody.bytes();

由于responseBody不能为空(RxJava2禁止它),bytes()总是返回一个值或抛出异常。