2012-12-11 13 views
9

ठीक है अब मेरे पास Class A है जिसमें कुछ स्पिनर हैं जो मान Class B द्वारा पॉप्युलेट किए जाएंगे जो AsnycTask तक फैले हुए हैं जो वेब सेवा से स्पिनर मानों को पकड़ते हैं। कक्षा बी में मैं टोस्ट में दिखाए गए मानों को पुनः प्राप्त करने का प्रबंधन करता हूं। समस्या यह है कि मैं उन स्पिनर मूल्यों को कक्षा ए में वापस कैसे पास करूं?AsyncTask क्लास पर PostExecute विधि

मैं

Can OnPostExcecute method in AsyncTask RETURN values?

की कोशिश की है नीचे

@Override 
protected void onPostExecute(String result) 
{ 
    classA.classAvariable = result; 
} 

तरह Class A की एक सार्वजनिक चर में Class B को Class A गुजर और मूल्य की दुकान से हालांकि जब भी मैं classAvariable पढ़ने की कोशिश मैं हमेशा NullPointer Exception प्राप्त करें। ऐसा लगता है कि चर के परिणाम को कभी भी असाइन नहीं किया गया था। पठनीयता उद्देश्य के लिए मुझे इनलाइन कक्षा के रूप में उपयोग करने के बजाय Class B को अलग करने की आवश्यकता है।

कोई भी विचार मेरे साथी जावा प्रोग्रामर?

+0

कोड है कि आप –

उत्तर

29

मुझे लगता है कि इससे पहले कि यह किया जा रहा है आप कक्षा एक चर को पढ़ने के लिए कोशिश कर रहे हैं .. कोशिश यह कॉलबैक फ़ंक्शन callbacks..in का उपयोग कर मान प्रदान करने के लिए और अपनी स्पिनरों को ताज़ा करने के लिए ..

आप बना सकते हैं interface, (निर्माता में) AsyncTask को इसे पारित, और फिर onPostExecute

में विधि कॉल उदाहरण के लिए:

आपका इंटरफ़ेस:

public interface OnTaskCompleted{ 
    void onTaskCompleted(values); 
} 

आपका गतिविधि:

public YourActivity implements OnTaskCompleted{ 
    //your Activity 
    YourTask task = new YourTask(this); // here is the initalization code for your asyncTask 
} 

और अपने AsyncTask:

public YourTask extends AsyncTask<Object,Object,Object>{ //change Object to required type 
    private OnTaskCompleted listener; 

    public YourTask(OnTaskCompleted listener){ 
     this.listener=listener; 
    } 

    //required methods 

    protected void onPostExecute(Object o){ 
     //your stuff 
     listener.onTaskCompleted(values); 
    } 
} 
+0

धन्यवाद यह काम करता है लिखा है प्रदान करें! हालांकि क्या आप इस कोड पर तर्क को समझाते हैं? क्योंकि यह AsyncTask कक्षा में गेटटर विधि को लागू करने के समान दिखता है (हालांकि यह वास्तविकता में काम नहीं करता है)। –

+2

यह है कि इसके बजाय काम करने के लिए गतिविधि में उत्तीर्ण होने की, तो आप एक श्रोता से गुजर रहे हैं एक कॉलबैक फ़ंक्शन की तरह है, (बटन श्रोता की तरह), जब वह काम यह कॉलबैक कॉल पूरा हो गया है (कॉल गतिविधि है कि इस कॉलबैक लागू करता है) और फिर गतिविधि क्या यह मुझे सही – Nermeen

+1

चाहता है, तो मैं गलत हूँ, मेरे तर्क को इंटरफेस कार्यान्वयन जब AsyncTask जबकि लागू करने क्योंकि AsyncTask समय विधि कहा जाता है द्वारा पूरा नहीं किया जा सकता है एक गेटर विधि काम नहीं हो सकता है किया जाता है कहा जाता है है। क्या ये सही है? –

0

एक इंटरफ़ेस बनाएँ तरह OnCompletRequest() फिर अपने ClassB निर्माता को यह गुजरती हैं और बस इस तरह के विधि में complete(yourList list) के रूप में इस इंटरफेस के अंदर विधि कॉल onPostExecute(String result)

+0

क्या आपको एक छोटा कोड स्निपेट प्रदान करने में कोई फर्क पड़ता है? मैं अस्पष्ट रूप से AsyncTask कक्षा में इंटरफ़ेस को कैसे कार्यान्वित करता हूं इसका अस्पष्ट हूं। –

+0

मैंने आपको यह जानने में मदद करने के लिए @Nunu का कोड अपडेट किया है कि यह कैसे काम करेगा। –

+0

धन्यवाद आप बहुत ज्यादा! यह बहुत उपयोगी था! –

1

समस्या यह है कि जब आप अपने AsynchTask निष्पादित करते हैं, तो इसके doInBackground() मेथोड अलग थ्रेड में चलाया जाता है और थ्रेड जिसने इस AsynchTask को आगे बढ़ना शुरू कर दिया है, इस प्रकार AsynchTask द्वारा आपके चर पर परिवर्तन होते हैं जो पैरेंट थ्रेड (जो इस AsynchTask को तुरंत कहते हैं) पर प्रतिबिंबित नहीं करता है।

उदाहरण -

class MyAsynchTask 
{ 

doInbackground() 
{ 
a = 2; 
} 

} 


int a = 5; 

new MyAsynchTask().execute(); 

// यहाँ एक अभी भी हो सकता है 5

+0

अच्छी तरह से अगर आपने अपना कोड पढ़ा है तो मैंने ऑनपोस्टएक्सक्यूट विधि में असाइनमेंट किया है .. जो यूआई थ्रेड नंबर पर चल रहा है? –

+0

हाँ! onPostExecute यूआई थ्रेड में चलता है लेकिन doInbackground के पूरा होने के बाद। – Mufazzal

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