/ / Rxjava2, Retrofit2, descarga la imagen como matriz de bytes - java, android, arrays, retrofit, rx-java2

Rxjava2, Retrofit2, descarga la imagen como matriz de bytes: java, android, arrays, retrofit, rx-java2

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 № 1

responseBody.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.