2011-11-27 14 views
19

पर NullPointerException मैंने हाल ही में अपनी गतिविधियों को टुकड़ों में परिवर्तित कर दिया है।AsyncTask निष्पादित होने पर टुकड़ों को प्रतिस्थापित किया जा रहा है - getActivity()

टैब-नेविगेशन के समान कुछ का उपयोग करते समय टुकड़े बदल दिए जाते हैं जब उपयोगकर्ता एक और टैब चुनता है। टुकड़े आबादी के बाद इंटरनेट से कुछ जानकारी प्राप्त करने के लिए कम से कम एक AsyncTask शुरू करें। हालांकि - उपयोगकर्ता किसी अन्य टैब पर स्विच करता है, तो बस के रूप में मेरी AsyncTask से doBackground-विधि निष्पादित किया जा रहा है - टुकड़ा बदल दिया जाता है और इस तरह मैं चिह्नित लाइनों में एक NullPointerException हो रही है:

@Override 
protected Object doInBackground(Object... params) { 
    ... 
    String tempjson = helper.SendPost(getResources().getText(R.string.apiid)); //ERROR: Fragment not attached 
    ... 
} 

protected onPostExecute(Object result) { 
    ... 
    getActivity().getContentResolver() //NULLPOINTEREXCEPTION 
    getView().findViewById(R.id.button) //NULL 
    ... 
} 

getActivity() और getResources() एक त्रुटि का कारण बनता है क्योंकि मेरा टुकड़ा बदल दिया गया है।

बातें मैं कोशिश की है:

  • कॉलिंग करता है, तो जाँच मेरी AsyncTask पर विधि को रद्द (प्रथम त्रुटि है और न ही दूसरा त्रुटि को ठीक नहीं होगा अगर टुकड़ा बदल दिया जाता है, जबकि onPostExecute() निष्पादित किया जाता है)
  • getActivity()null या this.isDetached() बुला है (नहीं एक असली ठीक है और मैं इसे जाँच करने के लिए जब भी मैं getActivity() फोन और इतने पर आवश्यकता होगी)

तो मेरा सवाल है: इन AsyncTask समस्याओं से छुटकारा पाने के लिए सबसे अच्छा क्या होगा? मुझे क्रियाओं का उपयोग करके इन समस्याओं में कोई समस्या नहीं थी क्योंकि उन्हें टैब परिवर्तन पर "मार डाला"/अलग नहीं किया गया था (जिसके परिणामस्वरूप उच्च स्मृति उपयोग हुआ - कारण मैं फ्रैगमेंट्स पर स्विच करना चाहता हूं)

उत्तर

18

चूंकि AsyncTask पृष्ठभूमि में चल रहा है , आपका टुकड़ा समाप्त होने तक अपनी मूल गतिविधि से अलग हो सकता है। जैसा कि आपने पाया है, आप चेक करने के लिए isDetached() का उपयोग कर सकते हैं। इसमें कुछ भी गलत नहीं है, और आपको हर बार जांचना नहीं है, बस टुकड़े और गतिविधि जीवन चक्रों पर विचार करें।

दो अन्य विकल्प:

  • लोडर का प्रयोग करें, वे टुकड़े के साथ अच्छे खेलने के लिए
  • टुकड़े से दसगुणा माता पिता गतिविधि और उपयोग इंटरफेस करने के लिए अपने AsyncTask लोड हो रहा है हटो डिजाइन किए हैं। गतिविधि को पता चलेगा कि एक टुकड़ा है या नहीं, और तदनुसार कार्य करें (यदि संभवतः टुकड़ा खत्म हो गया है तो परिणाम को छोड़कर)।
+8

आप का उपयोग करना चाहिए isDetached() केवल तभी जब आप स्पष्ट रूप से खंड को अलग कर देते हैं। अन्यथा, आपको उन मामलों को संभालने के लिए Added() का उपयोग करना चाहिए जहां सिस्टम ने आपकी गतिविधि और आपके टुकड़े के बीच लिंक को नष्ट कर दिया था। – pcans

+0

@ निकोले एलेंकोव कैसे जीवन चक्र निष्क्रियता को बुलाए जाने से पहले हर बार जांचने से बच सकता है? – Bear

-1

क्या आपने setRetainInstance(true); को onCreate() में अपने टुकड़े वर्ग के कार्य में कॉल करने का प्रयास किया है?

+1

यह इस मामले में मदद नहीं करता है, मुद्दे समान हैं। अभी के लिए मैंने गतिविधि के लिए फ़ील्ड बनाकर इसे हल किया है और 'view = getView()' का उपयोग करके उन्हें 'AtctivityCreated() 'में सेट और सेट कर दिया है। – Boni2k

4

आज मैं एक ही समस्या का सामना करना पड़ा है: जब मैं अगर AsyncTask अभी तक समाप्त नहीं हुआ है fragment प्रदर्शित किया जा रहा बदल गया है, और यह कुछ अधिक तत्वों के साथ यह पॉप्युलेट करने के लिए view का उपयोग करने की कोशिश करता है, यह एक NullPointerException लौट आते हैं।

मैंने टुकड़े जीवन चक्र की एक विधि को ओवरराइड करने में समस्या हल की: onDetach()fragmentactivity से अलग होने से पहले इस विधि को इस पल में बुलाया जाता है।

आपको अपने AsyncTask पर cancel() विधि को कॉल करने की आवश्यकता है।यह कार्य निष्पादन को NullPointerExecption से बचने से रोक देगा।

@Override 
public void onDetach() { 
    super.onDetach(); 
    task.cancel(true); 
} 

चेक टुकड़े जीवन चक्र के बारे में और अधिक जानकारी प्राप्त करने के लिए इस पेज:

यहाँ onDetach() का नमूना दिया गया http://developer.android.com/reference/android/app/Fragment.html#Lifecycle और यह एक कार्य रद्द कर रहा है के बारे में अधिक देखने के लिए: http://developer.android.com/reference/android/os/AsyncTask.html

+0

धन्यवाद, बहुत बहुत धन्यवाद। इसने मेरी समस्या को ठीक किया जो मुझे एक हफ्ते तक परेशान कर रहा था! –