2013-02-21 29 views
13

यहाँ मेरी स्थिति है।onCreateView() AsyncTask निष्पादित करने के लिए प्रतीक्षा करें?</p> <p>मेरी <code>onCreate()</code> में, मैं एक सर्वर के लिए डेटा पुनः प्राप्त और यह एक <code>ArrayList</code> में स्टोर करने के लिए एक <code>AsyncTask</code> बनाना चाहेंगे:

मेरी onCreateView() में फिर

, मैं एक ListView में वह डेटा डाल करने के लिए चाहते हैं, सेट एक onItemClickListener, आदि ...

समस्या यह है कि मैं AsyncTask और यूआई धागा के बीच एक दौड़ बनाने रहा हूँ। यदि onCreateView() से पहले AsyncTask पुन: प्राप्त करने में किया जाता है कहा जाता है, तो मैं एडाप्टर ठीक से सेट नहीं है, निर्धारित नहीं करते onItemClickListener, आदि ...

मैं किसी तरह से लगता है कि मैं AsyncTask के लिए प्रतीक्षा करना चाहते हैं onCreateView() फ़ंक्शन शुरू करने से पहले निष्पादन समाप्त करें। क्या यह संभव है? मैंने कार्य पर get() का उपयोग करने के बारे में पढ़ा, लेकिन मुझे इसे निष्पादित करने में कुछ परेशानी थी। ऐसा कुछ प्रतीत नहीं होता था।

कारण मैं onCreate() में डेटा पुनः प्राप्त और onCreateView() में एडाप्टर सेट (बजाय AsyncTask की onPostExecute() में अनुकूलक स्थापित करने का) करना चाहते हैं, कि मैं एक बार डेटा पुनः प्राप्त करना चाहते हैं, और करने में सक्षम हो बस दृश्य बनाएं यदि उपयोगकर्ता स्क्रीन को घुमाता है या उस Fragment पर वापस जाता है।

उत्तर

10

यहाँ एक बेहतर तरीका है के बाद देखने के लिए तैयार है शुरू हो जाती है। अपने ListView आरंभ करें और में अपना AsyncTask शुरू करें। एक बार सर्वर से डेटा उपलब्ध हो जाने पर, आप इसे उसी एरे में जोड़ते हैं जो आपके एडाप्टर को दिया गया था और अपने एडाप्टर के notifyDatasetChanged() पर कॉल करें, जो आपकी सूची दृश्य को पॉप्युलेट करने का ख्याल रखता है। यहां आप ListFragment का उपयोग कर सकते हैं, जिसमें आप अपनी सूची खाली होने पर प्रदर्शित होने वाले टेक्स्ट को जोड़ने के लिए setEmptyText() पर कॉल कर सकते हैं।

+0

ओह दिलचस्प द्वारा दिया जाता है।क्या मुझे एडाप्टर अपडेट करते समय हर बार InememClickListener() सेट करना होगा? या शुरुआत में बस एक बार? साथ ही, यदि दृश्य अभी तक नहीं बनाया गया है, तो मैं क्रिएट() में सूचीदृश्य कैसे प्रारंभ कर सकता हूं? क्या वह मुझे एक nullpointerexception नहीं दे सकता है? – user2085335

+0

आपको केवल एक बार 'OnItemClickListenter' सेट करना होगा। कोई डेटा नहीं होने पर सूची दृश्य प्रारंभ करने के लिए, केवल 'तत्व' के साथ 'ArrayList' का उपयोग करें। यह कोई NullPointerException नहीं देगा। बाद में जब डेटा पहुंचा तो आप उसे 'ArrayList' में जोड़ सकते हैं और 'NotifyDataSetChanged() 'को कॉल कर सकते हैं। – sujith

+0

धन्यवाद! बहुत अच्छा काम करता है! 'OnItemClickListener' टिप्पणी के बारे में एक त्वरित प्रश्न: यदि मेरे पास केवल 'setOnItemClickListener' कॉल' onCreateView() 'में है, तो यह काम नहीं कर रहा है। लेकिन अगर मैं एडाप्टर को अपडेट करने के बाद 'setOnItemClickListener' पर एक और कॉल जोड़ता हूं, तो यह काम करता है। यह वास्तव में एक बड़ा सौदा नहीं है क्योंकि यह इस तरह से काम कर रहा है, लेकिन मैं जानना चाहता हूं कि यदि आपके पास कोई विचार है तो ऐसा क्यों हो सकता है। धन्यवाद। – user2085335

0

तुम जो भी onCreateView() में कर रहे हैं, onViewCreated()

onViewCreated पर ले जाते हैं तो आप समस्या नहीं होगी तो

1

आप @ सुजीत के जवाब का पालन करना चाहिए और अपने कार्यान्वयन को बदलने, लेकिन यहाँ अपने विशिष्ट प्रश्न का उत्तर है:

मुझे यकीन है कि मैं खत्म होने से पहले क्रियान्वित करने के लिए AsyncTask के लिए प्रतीक्षा करने के लिए कोई रास्ता चाहते हैं onCreateView() फ़ंक्शन शुरू करना। क्या यह संभव है?

हां यह संभव है, लेकिन यह आपके यूआई को कार्य को समाप्त होने की प्रतीक्षा करते समय प्रदर्शित होने से रोक देगा।

बनाएँ और निष्पादित अपने AsyncTask तो यह करने के लिए संदर्भ पर पकड़:

MyAsyncTask mTask; 

... 
...onCreate() 
mTask = new MyAsyncTask(); 
mTask.execute(); 
... 
...onCreateView() 
myInfo = mTask.get(); 
super.onCreateView(). 

आपके मामले में यह एक बुरा विचार है, तथापि, कई बार जब आप कुछ इस तरह करने की जरूरत हो सकती है।

संपादित करें: mTask.get() वापस आ जाएगी जो कुछ doInBackground()