2017-08-20 3 views
0

Ich versuche, mehrere Bilder von der URL-Adresse herunterladen. Nachdem ich Byte [] zu Bitmap decodiere und es zu ImageView setze. Dieser Code funktioniert perfekt.Rxjava2, Retrofit2, Bild als Byte-Array herunterladen

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(); 
           .......... 
          } 
         } 
        }); 

Aber wenn ich rxjava2 verwende, und Retrofit2 funktioniert es nicht. Byte-Array kommt mit vielen 0 Werten aus.

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(); 
           } 
         } 

Was mache ich falsch? Welcher Unterschied besteht zwischen OkHttpClient-Anfrage und Retrofit2?

p.s. Ich brauche Glide oder Picasso nicht.

Antwort

0

responseBody.bytes() != null - Der Aufruf an bytes() liest den gesamten Stream und schließt dann die Antwort. Der Versuch, anschließend auf responseBody.byteStream() zuzugreifen, gibt immer einen geschlossenen Stream zurück.

Der richtige Code wäre:

byte[] array = responseBody.bytes(); 

Da responseBody nicht null sein kann (RxJava2 es verbietet) und bytes() gibt immer einen Wert oder eine Ausnahme auslöst.

Verwandte Themen