我尝试从网址中下载多张图片。在我将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。
答案 0 :(得分:0)
responseBody.bytes() != null
- 对bytes()
的调用会读取整个流,然后关闭响应。之后尝试访问responseBody.byteStream()
始终返回一个封闭的流。
正确的代码是:
byte[] array = responseBody.bytes();
由于responseBody
不能为空(RxJava2禁止它),bytes()
总是返回一个值或抛出异常。