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 一个值或抛出异常。
我尝试从 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 一个值或抛出异常。