2014-12-24 16 views
9

मैं एंड्रॉइड पर छवियों को डाउनलोड और कैश करने के लिए ग्लाइड का उपयोग कर रहा हूं। सबकुछ ठीक से काम करता है इस तथ्य को छोड़कर कि मैं बिटकमैप्स को सीधे ImageView में लोड नहीं करना चाहता, मैं फीका एनीमेशन नहीं चाहता, न ही छवि प्लेसहोल्डर।एंड्रॉइड ग्लाइड: बिटमैप्स को डाउनलोड और कैश कैसे करें?

मैं चाहता हूं कि एक वैश्विक विधि तैयार करें जो मुझे पूरे एप्लिकेशन में छवि डाउनलोड करने में मदद करेगी।

public class MyApp extends Application { 

    public static void downloadImage(String url, final OnImageLoadedCallback callback) { 

    // And how to implement the listener ? 

    RequestListener<String, Bitmap> requestListener = new RequestListener<String, Bitmap() { 
     @Override 
     public boolean onException(Exception exc, String string, Target<Bitmap> target, boolean isFirstResource) { 

      callback.onDone(null);    

      return false; 
     } 

     @Override 
     public boolean onResourceReady(Bitmap bitmap, String string, Target<Bitmap> target, boolean isFromMemoryCache, boolean isFirstResource) { 

      callback.onDone(bitmap); 

      return false; 
     } 
    }; 

     Glide.with(context) 
      .load(url) 
      .asBitmap() 
      .dontAnimate() 
      .diskCacheStrategy(DiskCacheStrategy.SOURCE) 
      .listener(requestListener); 
    } 

} 

समस्या यह है कि मुझे नहीं पता कि श्रोता को कैसे कार्यान्वित किया जाए। RequestListener बिल्कुल नहीं कहा जाता है।

+0

इस की चर्चा करते हुए प्रयास करें: [कड़ी] (http://android-developers.blogspot.in/2010/07/multithreading-for-performance.html)। –

उत्तर

14

ग्लाइड में लोड तब तक शुरू नहीं होते जब तक कि आप into पर कॉल न करें। RequestListener इंटरफ़ेस अनुरोधों को देखता है, लेकिन आमतौर पर परिणामों को संभालने के लिए नहीं है। RequestListener का उपयोग करने के बजाय, अपने कॉलबैक को Target इंटरफ़ेस को लागू करने पर विचार करें और into का उपयोग करके इसे पास करें।

वैकल्पिक रूप से आप सिर्फ SimpleTarget का विस्तार और यह एक ही तरीका है कि आप RequestListener उपयोग करने के लिए कोशिश कर रहे हैं में प्रत्येक अनुरोध को प्रेषित कर सकता है:

Target target = Glide.with(context) 
    ... 
    .into(new SimpleTarget<Bitmap>(width, height) { 
      @Override 
      public void onResourceReady(Bitmap resource, GlideAnimation glideAnimation) { 
       callback.onDone(resource); 
      } 

      @Override 
      public void onLoadFailed(Exception e, Drawable errorDrawable) { 
       callback.onDone(null); 
      } 
    }); 

// At some point later, if you want to cancel the load: 
Glide.clear(target); 

आपको एक चौड़ाई और ऊंचाई प्रदान करना चाहते हैं जाएगा ताकि ग्लाइड कर सकते हैं नीचे नमूना और छवियों को उचित रूप से परिवर्तित करें। यदि आप इन बिटमैप्स को दृश्यों में प्रदर्शित कर रहे हैं, तो आप रद्दीकरण के साथ समस्याओं में भी भाग सकते हैं, इस मामले में मैं दृढ़ता से आपके लोडिंग एपीआई में उपलब्ध दृश्य बनाने की सलाह देता हूं और into पर दृश्य पास कर दूंगा जो आपके लिए आकार और रद्दीकरण को संभालेगा।

+1

यदि आपको तुरंत छवि की आवश्यकता नहीं है या आप कॉलबैक के लिए 'RequestListener'' का उपयोग करना चाहते हैं तो आप '()' के बजाय 'प्रीलोड() 'को भी कॉल कर सकते हैं। –

5

मैं ग्लाइड 3.7.0 का उपयोग करें और छवियों इस तरह से डाउनलोड:
यह नोट करना महत्वपूर्ण है - यह asyncroniously कार्यान्वित

Glide.with(this) 
    .load(url) 
    .downloadOnly(new SimpleTarget<File>() { 
     @Override 
     public void onResourceReady(File resource, GlideAnimation<? super File> glideAnimation) { 
      LOGGER.debug("Photo downloaded"); 
     } 
    }); 

जब मैं कैश्ड छवि दिखाने की जरूरत है, मैं एक ही यूआरएल का उपयोग करें और DiskCacheStrategy.SOURCE:

Glide.with(this) 
    .load(url) 
    .diskCacheStrategy(DiskCacheStrategy.SOURCE) 
    .into(imageView); 
संबंधित मुद्दे