Intento descargar varias imágenes de la dirección url. Después de decodificar el byte [] al mapa de bits y configurarlo en ImageView. Este código funciona perfecto.
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();
..........
}
}
});
Pero si uso rxjava2, y retrofit2 no funciona. La matriz de bytes viene con muchos valores 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();
}
}
¿Qué estoy haciendo mal? ¿Qué diferencia hay entre la solicitud OkHttpClient y Retrofit2?
PD. No necesito usar Glide o Picasso.
Respuestas
0 para la respuesta № 1responseBody.bytes() != null
- La llamada a bytes()
lee la secuencia completa y luego cierra la respuesta. Tratando de acceder responseBody.byteStream()
después siempre devuelve un flujo cerrado.
El código correcto sería:
byte[] array = responseBody.bytes();
Ya que responseBody
no puede ser nulo (RxJava2 lo prohíbe) y bytes()
Siempre devuelve un valor o lanza una excepción.