2014-06-11 7 views
7

डाउनलोड करने के लिए,उपयोग पुराना वापस मैं अपने Android परियोजना पर रेट्रोफिट 1.6.0 का उपयोग छवि फ़ाइल

अनुरोध यूआरएल:

https://example.com/image/thumbs/filename/sample.png

इस तरह मेरे इंटरफ़ेस:

public interface ImageService { 
    @GET("/image/thumbs/filename/{filename}") 
    @Streaming 
    void getThumbs(
     @Path("filename") String filename, 
     Callback<Response> callback 
    ); 
} 

HTTP अनुरोध सफलता मिली, लेकिन कुछ त्रुटि हुई

D/Retrofit(27613): ---> HTTP GET https://example.com/image/thumbs/filename/sample.png 
D/Retrofit(27613): ---> END HTTP (no body) 
D/Retrofit(27613): <--- HTTP 200 https://example.com/image/thumbs/filename/sample.png (451ms) 
D/Retrofit(27613): : HTTP/1.1 200 OK 
D/Retrofit(27613): Connection: Keep-Alive 
D/Retrofit(27613): Content-Disposition: inline; filename="sample.png" 
D/Retrofit(27613): Content-Type: image/png; charset=binary 
D/Retrofit(27613): Date: Wed, 11 Jun 2014 06:02:31 GMT 
D/Retrofit(27613): Keep-Alive: timeout=5, max=100 
D/Retrofit(27613): OkHttp-Received-Millis: 1402466577134 
D/Retrofit(27613): OkHttp-Response-Source: NETWORK 200 
D/Retrofit(27613): OkHttp-Sent-Millis: 1402466577027 
D/Retrofit(27613): Server: Apache/2.2.22 (Ubuntu) 
D/Retrofit(27613): Transfer-Encoding: chunked 
D/Retrofit(27613): X-Powered-By: PHP/5.4.28-1+deb.sury.org~precise+1 
D/Retrofit(27613): ---- ERROR https://example.com/image/thumbs/filename/sample.png 
D/Retrofit(27613): java.io.UnsupportedEncodingException: binary 
D/Retrofit(27613):  at java.nio.charset.Charset.forNameUEE(Charset.java:322) 
D/Retrofit(27613):  at java.lang.String.<init>(String.java:228) 
D/Retrofit(27613):  at retrofit.RestAdapter.logAndReplaceResponse(RestAdapter.java:478) 
D/Retrofit(27613):  at retrofit.RestAdapter.access$500(RestAdapter.java:109) 
D/Retrofit(27613):  at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:333) 
D/Retrofit(27613):  at retrofit.RestAdapter$RestHandler.access$100(RestAdapter.java:220) 
D/Retrofit(27613):  at retrofit.RestAdapter$RestHandler$2.obtainResponse(RestAdapter.java:278) 
D/Retrofit(27613):  at retrofit.CallbackRunnable.run(CallbackRunnable.java:42) 
D/Retrofit(27613):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
D/Retrofit(27613):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
D/Retrofit(27613):  at retrofit.Platform$Android$2$1.run(Platform.java:142) 
D/Retrofit(27613):  at java.lang.Thread.run(Thread.java:841) 
D/Retrofit(27613): Caused by: java.nio.charset.UnsupportedCharsetException: binary 
D/Retrofit(27613):  at java.nio.charset.Charset.forName(Charset.java:309) 
D/Retrofit(27613):  at java.nio.charset.Charset.forNameUEE(Charset.java:320) 
D/Retrofit(27613):  ... 11 more 
D/Retrofit(27613): ---- END ERROR 

मैं इस समस्या को कैसे हल करूं?

Content-Type: image/png; charset=binary 

रेट्रोफिट यह देखता है और infers कि प्रतिक्रिया पाठ है कि यह लॉग इन कर सकते है:

+0

शायद http पर गौर

public interface ImageService { String ENDPOINT = "HTTP://REPLACE.ME"; @GET @Streaming Observable<Bitmap> getThumbs(@Url String filepath); /******** * Helper class that sets up a new services *******/ class Instance { static ImageService instance; public static ImageService get() { if (instance == null) instance = newImageService(); return instance; } public static ImageService newImageService() { Retrofit retrofit = new Retrofit.Builder() .baseUrl(ImageService.ENDPOINT) .addConverterFactory(BitmapConverterFactory.create()) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .build(); return retrofit.create(ImageService.class); } } } 

और मैं बिटमैप करने के लिए बाइट धारा परिवर्तित करने के लिए अपने खुद के BitmapConverterFactory लिखा है: //square.github.io/picasso/ जो स्क्वायर द्वारा बनाई गई एक छवि डाउनलोड लाइब्रेरी है। अन्यथा आपको retrofit http://square.github.io/retrofit/javadoc/index.html – Aegis

+0

पर टाइप किए गएफ़ाइल में देखना चाहिए। मेरे पास अन्य एपीआई रेट्रोफिट का उपयोग करते हैं, अगर इसे मेबेबे देखने के लिए लोड करने की आवश्यकता है तो मैं आपके सुझाव के लिए धन्यवाद, पिकासो का उपयोग करूंगा ! –

उत्तर

8

मुद्दा प्रतिक्रिया पर सामग्री प्रकार हैडर एक फर्जी चारसेट शामिल है। आपको सर्वर के व्यवस्थापक को समस्या की रिपोर्ट करनी चाहिए।

यदि आप गिटहब पर रेट्रोफिट के इश्यू ट्रैकर को इस मुद्दे की रिपोर्ट करते हैं, तो हम शायद दुर्घटनाग्रस्त होने की बजाय इस समस्या से ठीक हो सकते हैं।

+0

धन्यवाद! सर्वर-साइड "charset = बाइनरी" हटा दें, यह काम करता है! –

1

एक और तरीका है पूर्ण लॉगिंग बंद करने के लिए है, तो retrofit.RestAdapter.logAndReplaceResponse प्रतिक्रिया शरीर

2
बेशक हम आमतौर पर पिकासो छवि को लोड करने के लिए उपयोग के

उपभोग करने के लिए कोशिश नहीं करेंगे, लेकिन कभी कभी हम वास्तव में करने के लिए रेट्रोफिट का उपयोग की जरूरत है एक विशेष छवि लोड करें (जैसे कैप्चा छवि लाने के लिए), आपको अनुरोध के लिए कुछ शीर्षलेख जोड़ने की आवश्यकता है, प्रतिक्रिया के शीर्षलेख से कुछ मूल्य प्राप्त करें (बेशक आप पिकासो + ओकेएचटीपी का भी उपयोग कर सकते हैं, लेकिन एक प्रोजेक्ट में आप पहले से ही रेट्रोफिट का उपयोग कर सकते हैं नेट अनुरोधों के), तो यहां रेट्रोफिट 2.0.0 द्वारा कार्यान्वित करने का तरीका बताया गया है (मैंने पहले ही अपनी परियोजना में लागू किया है)।

मुख्य बिंदु यह है कि आपको प्रतिक्रिया प्राप्त करने के लिए okhttp3.ResponseBody का उपयोग करने की आवश्यकता है, अन्यथा रेट्रोफिट प्रतिक्रिया डेटा को JSON के रूप में पार्स करेगा, बाइनरी डेटा नहीं।

कोड:

public interface Api { 
    // don't need add 'Content-Type' header, it not works for Retrofit 2.0.0 
    // @Headers({"Content-Type: image/png"}) 
    @GET 
    Call<ResponseBody> fetchCaptcha(@Url String url); 
} 

Call<ResponseBody> call = api.fetchCaptcha(url); 
call.enqueue(new Callback<ResponseBody>() { 
     @Override 
     public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) { 
      if (response.isSuccessful()) { 
       if (response.body() != null) { 
        // display the image data in a ImageView or save it 
        Bitmap bm = BitmapFactory.decodeStream(response.body().byteStream()); 
        ivCaptcha.setImageBitmap(bm); 
       } else { 
        // TODO 
       } 
      } else { 
       // TODO 
      } 
     } 

     @Override 
     public void onFailure(Call<ResponseBody> call, Throwable t) { 
      // TODO 
     } 
    }); 
4

मैं rxjava साथ खेल रहे हैं और इन दिनों पुनः स्थापित कर रहा हूँ, मैं एक त्वरित प्रदर्शन यहाँ है। टॉक सस्ता है, आपको अपना कोड सीधे दिखाएं, उम्मीद है कि इससे मदद मिलती है।

public final class BitmapConverterFactory extends Converter.Factory { 

    public static BitmapConverterFactory create() { 
     return new BitmapConverterFactory(); 
    } 


    private BitmapConverterFactory() { 
    } 

    @Override 
    public Converter<ResponseBody, Bitmap> responseBodyConverter(Type type, Annotation[] annotations, 
                   Retrofit retrofit) { 
     if (type == Bitmap.class) { 
      return new Converter<ResponseBody, Bitmap>(){ 

       @Override 
       public Bitmap convert(ResponseBody value) throws IOException { 
        return BitmapFactory.decodeStream(value.byteStream()); 
       } 
      }; 
     } else { 
      return null; 
     } 
    } 

    @Override 
    public Converter<?, RequestBody> requestBodyConverter(Type type, Annotation[] annotations, 
                  Retrofit retrofit) { 
     return null; 
    } 
} 

Gradle यहाँ निर्भरताएँ::

final RETROFIT_VERSION = '2.0.0-beta3' 
compile "com.squareup.retrofit2:retrofit:$RETROFIT_VERSION" 
compile "com.squareup.retrofit2:adapter-rxjava:$RETROFIT_VERSION" 

चीयर्स, vanvency

संबंधित मुद्दे