android - AsyncTask as Inner class and static field issue -


मेरे पास एक तरीका है searchplace () जो एक स्थिर ऐरे को अपडेट करता है Google मानचित्र के साथ क्लास ए (फाइंडइटऑनमार्क) में कस्टम प्लेस ऑब्जेक्ट, और एक विधि updateMap () जो कि विभिन्न भौगोलिक बिंदुओं को अपडेट करता है मैं इन विधियों को बटन। पर क्लिक करें और सभी ठीक से काम करता है।

चूंकि इन विधियों का उपयोग इंटरनेट डेटा का होता है, यह ऑपरेशन कुछ समय ले सकता है, मैं एक आंतरिक वर्ग के कार्यान्वयन की तलाश कर रहा हूं इन दो तरीकों के प्रसंस्करण के दौरान प्रतीक्षा संवाद दिखाने के लिए वर्ग ए के अंदर बी ( YourCustomAsyncTask ) AsyncTask विस्तारित करता है

एक उपयोगकर्ता ने एक समाधान का सुझाव दिया यह प्रपत्र (जो जाहिरा तौर पर वैध लगता है):

  सार्वजनिक वर्ग FindItOnMap मानचित्रैक्टिविटी बढ़ाता है {स्थैतिक प्लेस [] पाया परिणाम; निजी प्रगति संवाद संवाद; @Create पर सार्वजनिक शून्य को ओवरराइड करें (बंडल सहेजे गए इन्स्टैंसस्टेट) {सुपर.नक्रेट (सहेजे गए इन्स्टेंसस्टेट); setContentView (R.layout.ricerca_condominio); MapView = (मानचित्रदृश्य) ढूंढें वीवीबीआईआईडी (आर.आईड.मैपव्यू); ............ ((छवि बटन) ढूंढें वीवीआईबीआईडी ​​(आरआईडी। बीटीएस सर्च))। सेटऑनक्लिकलिस्ट (एमएसएक्स्टलिस्टनरलिस्टर); } OnClickListener mSearchListener = नया OnClickListener () {सार्वजनिक शून्य पर क्लिक करें (देखें वी) {स्ट्रिंग स्थान = संपादक स्थान .gettext ()। ToString (); स्ट्रिंग का नाम = संपादकनाम .gettext ()। ToString (); // यहाँ AsyncTask को कॉल करें आपका NewCustomAsyncTask ()। निष्पादित करें (नया स्ट्रिंग [] {name, location}); }}; निजी क्लास YourCustomAsyncTask AsyncTask को बढ़ाता है & lt; स्ट्रिंग, शून्य, शून्य & gt; {@OverridePreExecute पर संरक्षित शून्य () {dialog = नई प्रगति डीआईएलओओजी (मेन.इस); dialog.setMessage ( "लोड हो रहा है ...."); dialog.setIndeterminate (सही); dialog.setCancelable (सही); dialog.show (); // हो सकता है कि आपको इसे बुरी तरह बुलाओ DoInBackGround में पिछला उत्तर से सुझाव दिया गया है) @ ओवरराइड संरक्षित वॉइड doInBackground (स्ट्रिंग ... स्ट्रिंग्स) {{खोज (तार [0], स्ट्रिंग [1]) की कोशिश करें; वापसी नल; } पकड़ (अपवाद ई) {}} @ ओवरराइड संरक्षित शून्य पर पोस्टएक्सएक्टेक (शून्य पैरामीटर) {updateMapWithResult (); dialog.dismiss (); // परिणाम} .....}   

प्रतीक्षा संवाद दिखाया गया है और पृष्ठभूमि में तरीकों को लागू किया जाता है, हालांकि कुछ अजीब कारणों से स्थिर सूची पाया परिणाम विभिन्न null वस्तुओं से भरा परिणाम ...

यह कैसे संभव है?

अगर मैं भीतर की कक्षा के बाहर विधि खोज (स्थान, नाम) सभी ठीक से काम करता है और अद्यतनMapWithResult (); सभी geopoint अपडेट करता है, इसलिए इन दो विधियां ठीक हैं। केवल अगर मैं इसे आंतरिक वर्ग में शुरू करने की कोशिश करता हूं तो जेसन कॉल काम कर रहे हैं, लेकिन स्थिर वैरिएबल पाया रिजल्ट null तत्वों से भरा है और प्रोग्राम ठीक से काम नहीं करता है ।

कोई भी सुझाव?

मुझे समझ में आया कि समस्या कहाँ है। आपको यूआई थ्रेड पर खोज पद्धति को चलाने के लिए करना है।

इस कोड ब्लॉक को परिवर्तित करें:

  @Override संरक्षित वॉयस doInBackground (स्ट्रिंग ... स्ट्रिंग्स) {try { खोज (तार [0], स्ट्रिंग [1]); वापसी नल; } पकड़ (अपवाद ई) {}}   

  @Override सुरक्षित वॉयड doInBackground (अंतिम स्ट्रिंग ... तार) {tryOnUiThread (try नया रननाबल () {सार्वजनिक शून्य चला () (खोज (तार [0], स्ट्रिंग [1]); वापसी नल;}}); } पकड़ (अपवाद ई) {e.printStackTrace (); }}   

और सभी को सही ढंग से काम करना चाहिए।

Comments