2017-08-20 17 views
0

URLアドレスから複数の画像をダウンロードしようとしています。その後、私はバイト[]をビットマップにデコードし、それをImageViewに設定します。このコードは完璧に機能します。Rxjava2、Retrofit2、バイト配列として画像をダウンロード

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.私はグライドやピカソを使う必要はありません。

答えて

0

responseBody.bytes() != null - bytes()を呼び出すと、ストリーム全体が読み込まれ、応答が閉じられます。その後、responseBody.byteStream()にアクセスしようとすると、常に閉じたストリームが返されます。

正しいコードは次のようになります

byte[] array = responseBody.bytes(); 
responseBody

は常に値を返すか、例外をスローbytes()ヌルである(RxJava2がそれを禁止)とすることができないので。

関連する問題