2011-04-07 13 views
5

मेरे AsyncTask ब्लॉक बटन तत्व ब्लॉक कर रहा है, जबकि छवि को डाउनलोड करने और प्रगति संवाद देरी के साथ दिखाया गया है - पहले छवि में दिखाया गया है थोड़ी देर के लिए अपने शो, लेकिन डाउनलोड लंबा समय लगता है और बटन अवरुद्ध है (नारंगी) और संवाद नहीं दिखाया गया है।AsyncTask ब्लॉक यूआई धागा और देरी के साथ शो प्रगतिबार

public Bitmap download(String url, ProgressBar progressbar) throws InterruptedException, ExecutionException { 
    BitmapDownloaderTask task = new BitmapDownloaderTask(progressbar); 
    task.execute(url); 
    return task.get(); 
} 

class BitmapDownloaderTask extends AsyncTask<String, Void, Bitmap> { 



    public BitmapDownloaderTask(ProgressBar progressbar) { 

    } 
    @Override 
    protected void onPreExecute() { 
     dialog = new ProgressDialog(ShowActivity.this); 
     dialog.setMessage("Loading"); 
     dialog.setIndeterminate(true); 
     dialog.setCancelable(false); 
     dialog.show(); 
    } 

    @Override 
    protected Bitmap doInBackground(String... Params) { 
     return imageLoader.getBitmap(params[0]); 

    } 
    @Override 
    protected void onPostExecute(Bitmap bitmap) { 
     dialog.dismiss(); 


    } 
}  

बटन श्रोता में, बस डाउनलोड फ़ंक्शन को कॉल करें, क्योंकि मैं imageView में प्रगति बार चक्र है प्रगति पैरामीटर है - संवाद केवल परीक्षण, क्यों देरी और ब्लॉक है पाया करने के लिए है। किसी अन्य ऐप्स में मैं runable का उपयोग करें और थ्रेड और तत्व अवरुद्ध नहीं है, लेकिन ट्यूटोरियल में AsyncTask इस के लिए बेहतर समाधान के रूप में उल्लेख किया है।

+0

के भीतर इस यह करने के लिए सही तरीका है छवि का उपयोग करने की जरूरत है, इस लिंक की जाँच करें: http: //www.android-ios-tutorials.com/ 182/शो-प्रगतिबार-while-डाउनलोड छवि का उपयोग कर-asynctask में एंड्रॉयड/ – Houcine

उत्तर

13

छवि डाउनलोड वास्तव में पृष्ठभूमि धागे में निष्पादित किया गया है, लेकिन return task.get(); के साथ आप बस इसे समाप्त करने की प्रतीक्षा कर रहे हैं, और यही आपके मुख्य धागे को अवरुद्ध कर रहा है।

कार्य को समाप्त होने के लिए आपको कॉलबैक के रूप में onPostExecute() का उपयोग करना चाहिए, इसलिए केवल संवाद को खारिज करने के लिए नहीं बल्कि doInBackground() द्वारा लौटाए गए बिटमैप के साथ आपको जो भी चाहिए, उसे करने के लिए भी उपयोग करना चाहिए।

+0

धन्यवाद विवरण के लिए एक बहुत! – Dupla

+0

टिप –

2

यह इसलिए है क्योंकि आप AsyncTask#get बुला रहे हैं:

वेट्स आवश्यक हो तो गणना को पूरा करने के लिए, और फिर उसके परिणाम प्राप्त करता है।

आप प्रदर्शन करना चाहिए जो कुछ भी आपरेशन आप के लिए onPostExecute()

+0

कि विवरण, सीधे Android दस्तावेज़ से सेवर दिन के लिए धन्यवाद, थोड़ा स्पष्ट है कि "प्रतीक्षा" एक बहुत ही तकनीकी भावना जहां में मतलब है हो सकता है "कुछ भी नहीं बुला धागे में हो सकता है, जैसे, UI अद्यतन।" –

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