5

मेरे पास AsyncTask एक अनिश्चित ProgressBar है जो आम तौर पर बहुत जल्दी निष्पादित करता है, लेकिन कभी-कभी धीरे-धीरे। जब कोई स्पष्ट प्रतीक्षा नहीं होती है तो प्रगति पट्टी को तेज़ी से फ्लैश करने के लिए यह अवांछनीय और विचलित है।न्यूनतम देरी के बाद ही मैं प्रोग्रेसबार कैसे दिखा सकता हूं?

क्या कोई अन्य नेस्टेड AsyncTask बनाने के बिना प्रगति पट्टी के प्रदर्शन में देरी करने का कोई तरीका है?

उत्तर

3

Code Droid के लिए धन्यवाद, मैं एक सार AsyncTask कक्षा लिखने में सक्षम था जो निर्दिष्ट विलंब के बाद अनिश्चित प्रगति पट्टी दिखाता है। बस AsyncTask के बजाय इस वर्ग का विस्तार और जब उचित super() कॉल करने के लिए सुनिश्चित हो:

public abstract class AsyncTaskWithDelayedIndeterminateProgress 
     <Params, Progress, Result> extends AsyncTask<Params, Progress, Result> { 
    private static final int MIN_DELAY = 250; 
    private final ProgressDialog progressDialog; 
    private final CountDownTimer countDownTimer; 

    protected AsyncTaskWithDelayedIndeterminateProgress(Activity activity) { 
     progressDialog = createProgressDialog(activity); 
     countDownTimer = createCountDownTimer(); 
    } 

    @Override protected void onPreExecute() { 
     countDownTimer.start(); 
    } 

    @Override protected void onPostExecute(Result children) { 
     countDownTimer.cancel(); 
     if(progressDialog.isShowing()) 
     progressDialog.dismiss(); 
    } 

    private ProgressDialog createProgressDialog(Activity activity) { 
     final ProgressDialog progressDialog = new ProgressDialog(activity); 
     progressDialog.setIndeterminate(true); 
     return progressDialog; 
    } 

    private CountDownTimer createCountDownTimer() { 
     return new CountDownTimer(MIN_DELAY, MIN_DELAY + 1) { 
     @Override public void onTick(long millisUntilFinished) { } 

     @Override public void onFinish() { 
      progressDialog.show(); 
     } 
     }; 
    } 
0

मुझे लगता है कि आप अपने AsyncTask समाप्त होने से कम से कम कुछ बार प्रोग्रेसअपडेट पर कॉल कर रहे हैं। यदि ऐसा है, तो आप यह क्या कर सकते हैं। प्रत्येक बार प्रोग्रेसअपडेट पर कॉल करने से पहले, Thread.sleep (250) पर कॉल करें। इस तरह आपकी पृष्ठभूमि थ्रेड यूआई थ्रेड के साथ संवाद करने से पहले रोक देगा और लंबे समय तक चलने वाले कार्य की उपस्थिति देगी। ऐसा विफल होने पर, मुझे शायद आपका कोड देखने या कुछ और जानकारी प्राप्त करने की आवश्यकता होगी।

+0

क्षमा करें, यह एक अनिश्चित 'ProgressBar' है। मैं इसे और अधिक प्रसन्न करने के लिए बस देरी नहीं करना चाहता, मैं पूरी तरह से डिस्प्ले से बचना चाहता हूं जब तक देरी से अधिक नहीं हो जाता, कहें, 250ms। –

+0

ठीक है, गोचा। यह अब मुझे और अधिक समझ में आता है। आपका पृष्ठभूमि ऑपरेशन क्या है? –

+0

मैंने इस मामले में इसे एक और तरीका हल किया, लेकिन भविष्य में मैं इसे डाउनलोड या सीपीयू गहन संचालन जैसी चीजों पर लागू करना चाहता हूं। कुछ डिवाइस या नेटवर्क कनेक्शन जल्दी से प्रतिक्रिया दे सकते हैं कि "कृपया प्रतीक्षा करें" पॉपअप, और अन्य धीमे लोगों को वारंट न करें। हालांकि मुझे विश्वास नहीं है कि हमने प्रगति पट्टी के प्रदर्शन में देरी से 250 एमएस की समस्या को आगे नहीं बढ़ाया है। यदि ऑपरेशन ने 251 एमएस लिया है, तो निश्चित रूप से आपको अभी भी झपकी/गड़बड़ी मिल जाएगी, लेकिन फिर 100 एमएमएस देरी जोड़ने से यह थोड़ा आसान लग सकता है और उतना सापेक्ष प्रदर्शन प्रभाव नहीं पड़ता है। –

4

हां, वहां है और इसे CountDownTimer कहा जाता है और इसका अत्यधिक उपयोग नहीं किया जाता है। आप टाइमर के प्रत्येक टिक पर या टाइमर खत्म होने पर कार्रवाई कर सकते हैं।

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

  • कोई संबंधित समस्या नहीं^_^