Rxjava2、Retrofit2、以字节数组形式下载图片

Rxjava2, Retrofit2, download image as byte array

我尝试从 url 地址下载几张图片。在我将 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。

responseBody.bytes() != null - 调用 bytes() 读取整个流然后关闭响应。之后尝试访问 responseBody.byteStream() 总是 returns 一个关闭的流。

正确的代码是:

byte[] array = responseBody.bytes();

因为 responseBody 不能为空(RxJava2 禁止它)并且 bytes() 总是 returns 一个值或抛出异常。