ग्लाइड लाइब्रेरी का उपयोग करके छवि लोडिंग के पूरा होने पर प्रगति बार की दृश्यता निर्धारित करें


90

नमस्ते मैं छवि के लिए एक प्रगति पट्टी रखना चाहता हूं जो छवि लोड करते समय दिखाई जाएगी लेकिन जब छवि लोडिंग पूरी हो जाएगी तो मैं इसे सेट करना चाहता हूं। पहले मैं इसके लिए पिकासो पुस्तकालय का उपयोग कर रहा था। लेकिन मुझे नहीं पता कि इसे ग्लाइड लाइब्रेरी के साथ कैसे इस्तेमाल किया जाए। मुझे लगता है कि कुछ संसाधन तैयार समारोह है, लेकिन मुझे नहीं पता कि इसका उपयोग कैसे करना है। क्या कोई मेरी मदद कर सकता है?

पिकासो लाइब्रेरी के लिए कोड

Picasso.with(mcontext).load(imgLinkArray.get(position).mUrlLink)
       .into(imageView, new Callback() {
           @Override
           public void onSuccess() {
               progressBar.setVisibility(View.GONE);
           }

           @Override
           public void onError() {
           }
        })
;

अब मैं ग्लाइड के साथ यह कैसे कर सकता हूं?

Glide.with(mcontext).load(imgLinkArray.get(position).mUrlLink)
     .into(imageView);

मैं ग्लाइड के साथ छवि को लोड करने में सक्षम हूं लेकिन progressBar.setVisibility(View.GONE);अगर छवि लोड हो जाती है तो मैं कोड में कहीं कैसे लिख सकता हूं ?


2
आपने अपनी लाइब्रेरी क्यों बदली? पिकासो महान है।
तस्मानी

जब तक आपके पास पुस्तकालयों को बदलने का अच्छा कारण नहीं है, मैं भी पिकासो के साथ चिपके रहने की सलाह दूंगा
क्रिस

जवाबों:


229

प्रश्न बल्कि पुराना है, और मुझे नहीं पता कि उन समय में ग्लाइड के साथ क्या स्थिति थी, लेकिन अब इसे आसानी से श्रोता के साथ किया जा सकता है (सही रूप में चुने गए उत्तर में प्रस्तावित नहीं)।

progressBar.setVisibility(View.VISIBLE);
Glide.with(getActivity())
     .load(args.getString(IMAGE_TO_SHOW))
     .listener(new RequestListener<String, GlideDrawable>() {
         @Override
         public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) {
             return false;
         }

         @Override
         public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {
             progressBar.setVisibility(View.GONE);
             return false;
         }
     })
     .into(imageFrame)
;

यदि आप एनिमेशन जैसी चीजों को खुद संभालना चाहते हैं और आप के लिए उन्हें संभालने के लिए ग्लाइड चाहते हैं तो आप सही हैं।


13
छिपाने पर विचार progressBarमें onExceptionअच्छी तरह से है, अन्यथा यह अनिश्चित काल के लिए झूठी आशा दे रही स्पिन जाएगा। एक बार onExceptionकहा जाता है कि ग्लाइड सेट के अलावा कुछ भी नहीं करेगा जो पारित हो गया है .error()
टीडब्लूआरआरओबी

2
यह एक NullPointerException में परिणाम कर सकते हैं यदि आप छवि लोड होने से पहले Fragment / गतिविधि छोड़ देते हैं।
aProperFox

1
मैं आपको आंतरिक वर्ग के श्रोताओं को बनाने के लिए आंदोलन नहीं कर रहा हूँ, कार्य को पूरा करने के लिए एक उपकरण दिखाने का सबसे संक्षिप्त तरीका है।
यारोस्लाव

1
निश्चित बात, मैंने Glide.clear (yourImageView) कहने के लिए सुपर कॉल से पहले onDestroyVIew () में एक कॉल जोड़कर इसे हल किया
aProperFox

7
नोट: .listenerपहले बुलाया जाना चाहिए.into()
अहमद Mostafa

31

यदि आप कोटलिन में ऐसा करना चाहते हैं, तो आप इस तरह से कोशिश कर सकते हैं:

    Glide.with(context)
            .load(url)
            .listener(object : RequestListener<Drawable> {
                override fun onLoadFailed(e: GlideException?, model: Any?, target: Target<Drawable>?, isFirstResource: Boolean): Boolean {
                    //TODO: something on exception
                }
                override fun onResourceReady(resource: Drawable?, model: Any?, target: Target<Drawable>?, dataSource: DataSource?, isFirstResource: Boolean): Boolean {
                    Log.d(TAG, "OnResourceReady")
                    //do something when picture already loaded
                    return false
                }
            })
            .into(imgView)

5
इसके अलावा लक्ष्य को आयात करने की आवश्यकता है:import com.bumptech.glide.request.target.Target
गिबोल्ट

@ Gibolt यह मुझे 10 मिनट के लिए सीधा खड़ा कर रहा था
johnrao07

17

मेरा उत्तर आउट-डेटेड APIs पर आधारित था। अधिक अप-टू-डेट उत्तर के लिए यहां देखें ।


.listener()बेहतर है क्योंकि आप अपने लोड (मॉडल, मेमोरी कैश, ...) के बारे में अधिक जानकारी प्राप्त करेंगे, इसलिए अधिक कस्टम तर्क तय करना आसान है। RequestListenerयह भी अधिक स्थिर है, जो ओवरराइडिंग है जो Targetआपको भविष्य के फ़िक्सेस का लाभ नहीं देगा। आप यह भी आसानी से बना सकते हैं VisibilityListener<T, R>कि आप विभिन्न संदर्भों में फिर से उपयोग कर सकते हैं।
टीडब्लूआरआरओबी

10

अपवाद में फिर से दिखाने के लिए एक शर्त रखी ProgressBar

 Glide.with(context)
    .load(image_url)
    .listener(new RequestListener<String, GlideDrawable>() {
        @Override
        public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) {
            if(e instanceof UnknownHostException)
                progressBar.setVisibility(View.VISIBLE);
            return false;
        }

        @Override
        public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {
            progressBar.setVisibility(View.GONE);
            return false;
        }
    })
    .into(imageView);

7

उपरोक्त समाधान मेरे लिए भी बहुत अच्छा काम करता है, लेकिन जब मैं इमेज डाउनलोड करने के लिए asBitmap () का उपयोग करता हूं । यह काम नहीं करता।

हमें BitmapImageViewTarget का उपयोग करने की आवश्यकता है

Glide.with(this) .load(imageURL)
 .asBitmap()
 .placeholder(R.drawable.bg)
 .into(new BitmapImageViewTarget(imageView) {
            @Override
            public void onResourceReady(Bitmap  drawable, GlideAnimation anim) {
                super.onResourceReady(drawable, anim);
                progressBar.setVisibility(View.GONE);
            }
        });

मेरी टिप्पणी देखें: stackoverflow.com/questions/26054420/… । यह उत्तर मेरे द्वारा कही गई बातों का अच्छा प्रदर्शन है।
टीडब्लूआरआरओबी

7

GlideDrawable को हटा दिया जाता है, सरल Drawable का उपयोग करें

RequestOptions requestOptions = new RequestOptions();
requestOptions.placeholder(R.drawable.placeholder);
requestOptions.error(R.drawable.error);

Glide.with(getContext())
                 .setDefaultRequestOptions(requestOptions)
                 .load(finalPathOrUrl)
                 .listener(new RequestListener<Drawable>() {
                        @Override
                        public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
                            progressBar.setVisibility(View.GONE);
                            return false;
                        }

                        @Override
                        public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
                            progressBar.setVisibility(View.GONE);
                            return false;
                        }
                    })
                 .into(mImageView);

4

कोटलिन में आप नीचे की तरह कर सकते हैं

Glide.with(context)
            .setDefaultRequestOptions(RequestOptions().placeholder(R.drawable.ic_image_placeholder).error(R.drawable.ic_image_placeholder))
            .load(url)
            .listener(object : RequestListener<Drawable>{
                override fun onLoadFailed(e: GlideException?, model: Any?, target: Target<Drawable>?, isFirstResource: Boolean): Boolean {
                    return false
                }

                override fun onResourceReady(resource: Drawable?, model: Any?, target: Target<Drawable>?, dataSource: DataSource?, isFirstResource: Boolean): Boolean {
                    return false
                }

            })
            .into(imageView)

2
  1. Xml में ऊँचाई और चौड़ाई (match_parent) के साथ प्रगति पट्टी लें।
  2. उल्लेख विधि से नीचे कॉल करने से पहले, प्रगति बार दृश्यता सेट करें।

    public void setImageWIthProgressBar(Context context, final ImageView imageView, String imageUrl, final ProgressBar progressBar) {
    
            Glide.with(context)
                    .load(imageUrl)
                    .listener(new RequestListener<String, GlideDrawable>() {
                        @Override
                        public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) {
                            progressBar.setVisibility(View.GONE);
                            return false;
                        }
    
                        @Override
                        public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {
                            progressBar.setVisibility(View.GONE);
                            return false;
                        }
                    })
                    .into(imageView);
    
        }//setImageWIthProgressBar
    

आपका जवाब stackoverflow.com/a/31675796/3812404 से कैसे अलग है ? इसके अलावा, बिंदु 1 की आवश्यकता नहीं है।
हरिराम

2

अपडेट करें:

Glide.with(this)
            .load(imageUrl)
            .listener(new RequestListener<Drawable>() {
                @Override
                public boolean onLoadFailed(@Nullable final GlideException e,
                                            final Object model, final Target<Drawable> target,
                                            final boolean isFirstResource) {
                    showProgress(false);

                    mNoContentTextView.setVisibility(View.VISIBLE);

                    return false;
                }

                @Override
                public boolean onResourceReady(final Drawable resource, 
                                               final Object model, 
                                               final Target<Drawable> target, 
                                               final DataSource dataSource, 
                                               final boolean isFirstResource) {
                    showProgress(false);

                    mNoContentTextView.setVisibility(View.GONE);
                    mContentImageView.setImageDrawable(resource);

                    return false;
                }
            })
            .into(mContentImageView);

कहो, अगर आपके पास पहले से ही हैResourceReady, "में" का उपयोग क्या है? क्या मैं अकेले श्रोता का उपयोग नहीं कर सकता? ? यदि हां, तो कैसे मैं इस पर बिना "लोड होना प्रारंभ कर सकते हैं
Android डेवलपर

@android डेवलपर के रूप में मुझे पता है कि आप का उपयोग कर सकते हैं
Narek Hayrapetyan

यह प्रयास करने के लिए खड़ा है
Narek Hayrapetyan

लेकिन अगर मैं "में" का उपयोग नहीं करता हूं, तो मुझे लगता है कि यह इसके बारे में चेतावनी देता है।
Android डेवलपर

1

मैंने चीजें कैसे कीं। कम रास्ता, क्लीनर कोड

उदाहरण:

progress_bar.visibility = View.VISIBLE

profilePicturePath?.let {
    GlideApp.with(applicationContext)
        .load(CloudStorage.pathToReference(it))
        .placeholder(R.drawable.placeholder)
        .listener(GlideImpl.OnCompleted {
            progress_bar.visibility = View.GONE
        })
    .into(profile_picture)
} ?: profile_picture.setImageResource(R.drawable.placeholder)

उपयोग:

GlideImpl.OnCompleted {
    // completed
}

बस GlideImpl.OnCompleted { }ग्लाइड के पास.listener()

GlideImpl.kt वर्ग जो ग्लाइड के अनुरोध सूची को स्वीकार करता है

import android.graphics.drawable.Drawable
import com.bumptech.glide.load.DataSource
import com.bumptech.glide.load.engine.GlideException
import com.bumptech.glide.request.RequestListener
import com.bumptech.glide.request.target.Target

object GlideImpl {

    object OnCompleted : RequestListener<Drawable> {

        private lateinit var onComplete: () -> Unit

        operator fun invoke(onComplete: () -> Unit): OnCompleted {
            OnCompleted.onComplete = { onComplete() }
            return this
        }

        override fun onResourceReady(
            resource: Drawable?,
            model: Any?,
            target: Target<Drawable>?,
            dataSource: DataSource?,
            isFirstResource: Boolean
        ): Boolean {
            onComplete()
            return false
        }

        override fun onLoadFailed(
            e: GlideException?,
            model: Any?,
            target: Target<Drawable>?,
            isFirstResource: Boolean
        ): Boolean {
            onComplete()
            return false
        }
    }
}

और वह यह है!


0

कोटलिन रास्ता

Glide.with(context)
                .load(image_url)
                .listener(object : com.bumptech.glide.request.RequestListener<Drawable> {
                    override fun onLoadFailed(
                        e: GlideException?,
                        model: Any?,
                        target: Target<Drawable>?,
                        isFirstResource: Boolean
                    ): Boolean {
                        return false
                    }

                    override fun onResourceReady(
                        resource: Drawable?,
                        model: Any?,
                        target: Target<Drawable>?,
                        dataSource: DataSource?,
                        isFirstResource: Boolean
                    ): Boolean {
                        img_product_banner.visibility = View.VISIBLE
                        return false
                    }

                }).placeholder(R.drawable.placeholder)
                .diskCacheStrategy(DiskCacheStrategy.ALL)
                .into(img_product_banner)

-1

यह सबसे अच्छा उत्तर है क्योंकि यह वांछित आउटपुट प्राप्त करने के लिए दृश्यता सेट करने जैसी किसी भी हैक का उपयोग नहीं करता है।

प्रगतिबार का एक gif डाउनलोड करें progressbargifऔर इसे कॉल करें और ड्रा करने योग्य फ़ोल्डर में डालें।

        Glide.with(ctx)
            .load(url)
            .thumbnail(Glide.with(ctx).load(R.drawable.progressbargif))
            .diskCacheStrategy(DiskCacheStrategy.SOURCE)
            .error(R.drawable.image_unavailable)
            .crossFade(200)
            .into(iv);

एक बार url की छवि लोड होने के बाद, थंबनेल गायब हो जाता है। कैश्ड छवि लोड होने पर थंबनेल तुरंत गायब हो जाता है।


4
मुझे लगता है कि यह इसलिए था क्योंकि यह सवाल का जवाब नहीं दे रहा है: ओपी के पास पहले से ही एक स्पिनर है जिससे वह खुश है। यह एंड्रॉइड की सर्वोत्तम प्रथाओं के भी खिलाफ है: GIF का उपयोग स्पिनर के रूप में 90 के दशक में होता है और एपीके का आकार काफी बढ़ जाता है; और में एक GIF डाल drawableअपने आप में बुरा है, क्योंकि यह ढांचा द्वारा लोड नहीं है, यह होना चाहिए rawया assetsसबसे अच्छे रूप में। बदलते दृश्य के साथ कुछ भी गलत नहीं है जब आपके ऐप में घटनाएं होती हैं, तो एंड्रॉइड उसी के लिए डिज़ाइन किया गया है।
ट्वीस्ट्रीमोब

1
जीआईएफ डिकोडिंग होने के दौरान उपयोगकर्ता को एक खाली जगह भी दिखाई देगी, यह एसिंक्स है और तत्काल नहीं है। आप RESULTप्रगति-बार का भी उपयोग कर रहे हैं , जिसका अर्थ है कि इसे लोड करने में कुछ समय लगेगा। SOURCEकार्यकुशलता के लिए जीआईएफ को सबसे अच्छे तरीके से कैच किया जाना चाहिए ; लेकिन चूंकि यह एक स्थानीय फ़ाइल है, इसलिए कैश NONEको डिस्क पर डुप्लिकेट नहीं करने की आवश्यकता है , और भी अधिक उपयोगकर्ता स्थान का उपभोग करते हुए।
ट्वीस्टरेब
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.