दिलचस्प पोस्ट
कोणीय जेएस: निर्देशक की लिंक फ़ंक्शन की आवश्यकता क्या है जब हमारे पास पहले से ही निर्देश के नियंत्रक का दायरा था? आर में स्तंभ में प्रत्येक परिवर्तन के लिए 1 से वृद्धि PHP के साथ GET-variables को निकालने का शानदार तरीका? डिस्क आधारित हैशमैप JavaFX 2.2 में एसवीजी छवि सी ++ const नक्का तत्व का उपयोग OnClick (DialogInterface v, int buttonId) में संदर्भ प्राप्त करें? आइस क्रीम सैंडविच और जेली बीन में होम बटन ब्लॉक करें ओएस एक्स में sed के साथ इन-प्लेस संपादन कैसे स्प्रिंग कॉन्फिग फाइल में बीन की संपत्ति एक एन्यूम मूल्य आवंटित? अनुरोध एन्निमेशनफ़्रेम द्वारा कैनवास में एफपीएस की गणना करें पीडीओ में जैसे प्रश्न को लागू करें JComboBox स्वत: पूर्ण कैसे पूरे एचटीएमएल शरीर को केंद्र में संरेखित करें? Javascript में typeof के साथ === === का उपयोग करने का कारण क्या है?

एंड्रॉइड एएससीएनसी कार्य प्रगति डीआईएलओओग पृष्ठभूमि धागा समाप्त होने तक प्रदर्शित नहीं हो रहा है

मेरे पास एक एंड्रॉइड गतिविधि है जो एक आरएसएस फ़ीड को यूआरएल से पकड़ लेती है, और सैक पार्सर का उपयोग करता है ताकि प्रत्येक वस्तु को एक्सएमएल से एक सरणी में चिपकाना पड़े। यह सब ठीक काम करता है, लेकिन अपेक्षित रूप में कुछ समय लगता है, इसलिए मैं पृष्ठभूमि में ऐसा करने के लिए AsyncActivity का उपयोग करना चाहता हूं। मेरा कोड निम्नानुसार है:

class AddTask extends AsyncTask<Void, Item, Void> { protected void onPreExecute() { pDialog = ProgressDialog.show(MyActivity.this,"Please wait...", "Retrieving data ...", true); } protected Void doInBackground(Void... unused) { items = parser.getItems(); for (Item it : items) { publishProgress(it); } return(null); } protected void onProgressUpdate(Item... item) { adapter.add(item[0]); } protected void onPostExecute(Void unused) { pDialog.dismiss(); } } 

मैं किसके साथ onCreate() कॉल करता हूं

 new AddTask().execute(); 

लाइन items = parser.getItems() XML- से प्रत्येक आइटम वाले items = parser.getItems() ठीक-ठीक काम करता है items = parser.getItems() मैं जो समस्या का सामना कर रहा हूं वह यह है कि गतिविधि को शुरू करने पर, प्रगति onPreExecute() , जिसे मैं onPreExecute() बना देता onPreExecute() प्रदर्शित नहीं होता जब तक कि doInBackground() विधि समाप्त हो जाए। यानी मुझे एक काली स्क्रीन मिलती है, एक लंबा विराम, फिर आइटम के साथ पूरी तरह से आबादी वाला सूची। यह क्यों हो रहा है? यूआई ड्राइंग क्यों नहीं है, प्रगति डीआईएलओग दिख रहा है, पार्सर्स को आइटम मिल रहा है और इन्हें सूची में बढ़ाना है, तो प्रगति डीआईएलओजी को खारिज करना?

Solutions Collecting From Web of "एंड्रॉइड एएससीएनसी कार्य प्रगति डीआईएलओओग पृष्ठभूमि धागा समाप्त होने तक प्रदर्शित नहीं हो रहा है"

यह मेरे लिए काम करता है

 @Override protected void onPreExecute() { dialog = new ProgressDialog(viewContacts.this); dialog.setMessage(getString(R.string.please_wait_while_loading)); dialog.setIndeterminate(true); dialog.setCancelable(false); dialog.show(); } 

मुझे संदेह है कि कार्य को निष्पादित करने के बाद आपके UI थ्रेड को अवरोधित कर रहा है। उदाहरण के लिए, मैंने लोगों को इस तरह से काम करते देखा है:

 MyTask myTask = new MyTask(); TaskParams params = new TaskParams(); myTask.execute(params); myTask.get(5000, TimeUnit.MILLISECONDS); 

यहां मिलती जुलती यूआई थ्रेड को अवरुद्ध करने जा रही है (जो संभवत: यहां कार्य को कताई कर रहा है …) जो कार्य के पूर्ण होने तक आपके कार्य के पहले संस्करण () विधि में किसी भी UI संबंधित सामग्री को रोक देगा। ओह! उम्मीद है की यह मदद करेगा।

ऐसा इसलिए है क्योंकि आपने AsyncTask.get() उपयोग किया था जो यूआई थ्रेड को ब्लॉक करता है "अगर कंप्यूटेशन को पूरा करने के लिए आवश्यक है, और इसके परिणाम प्राप्त करने के लिए इंतजार करता है।"

ऐसा करने का सही तरीका है कि AsyncTask द्वारा अपने AsyncTask लिए Activity उदाहरण देना, और आप जो भी करना चाहते हैं उसे AsyncTask.onPostExecution() में समाप्त करना है।

यदि आप अपनी वास्तविक गतिविधि में एसिंककास को उप-वर्ग करते हैं, तो आप पृष्ठभूमि कॉल के परिणाम को अपने कॉलिंग क्लास के सदस्य को असाइन करने के लिए onPostExecute विधि का उपयोग कर सकते हैं।

परिणाम इस पद्धति में एक पैरामीटर के रूप में पारित किया गया है, यदि तीसरा सामान्य प्रकार के रूप में निर्दिष्ट किया गया है।

इस तरह, आपके UI थ्रेड को ऊपर बताए अनुसार अवरुद्ध नहीं किया जाएगा। आपको उपवर्ग के बाहर परिणाम के बाद के किसी भी उपयोग का ध्यान रखना होगा, क्योंकि पृष्ठभूमि धागा अभी भी चल रहा है और आपके सदस्य का नया मान नहीं होगा।