2012-06-25 9 views
15

मैंने आलसी डाउनलोड और अपडेट करने के लिए, मेरे आवेदन के साथ AsyncTasks का उपयोग किया है।एंड्रॉइड AsyncTasks कैसे जांचें यदि गतिविधि अभी भी चल रही है

अभी के लिए मेरी AsyncTasks यूआई अद्यतन करता है असली बस:

protected void onProgressUpdate(String... values) { 
     super.onProgressUpdate(values); 
     gender.setText(values[0]); 
} 

मेरे समस्या अगर गतिविधि है जो लिंग TextView से प्रदान की गई, अभी भी उपलब्ध है की जाँच करने के लिए कैसे है?

यदि नहीं, तो मुझे एक त्रुटि मिलेगी और मेरा आवेदन बंद हो जाएगा।

+0

साथ नहीं यकीन है कि कोशिश कर सकते हैं कि क्या करता है, तो (शून्य == लिंग && gender.isShown()) –

उत्तर

25

आप गतिविधि के OnDestroy

@Override 
protected void onDestroy() { 
    asynctask.cancel(true); 
    super.onDestroy(); 
} 

में अपने asynctask रद्द कर सकते हैं और जब परिवर्तन प्रदर्शन कर आप जाँच करें कि क्या आपके asynctask रद्द कर दिया गया (गतिविधि को नष्ट कर दिया है) या नहीं

protected void onProgressUpdate(String... values) { 
    super.onProgressUpdate(values); 
    if(!isCancelled()) { 
     gender.setText(values[0]); 
    } 
} 
+0

अच्छा। लेकिन कोई गुरुत्वाकर्षण नहीं है कि ऑनडेस्ट्रॉय हर बार बुलाया जाएगा। (नीचे संदर्भ लिंक के लिए)। आप इसका सामना कैसे करते हैं? https://stackoverflow.com/a/4449988/3265444 – Ajji

0

नहीं

if (gender) { 
    gender.setText(values[0]); 
} 

पर्याप्त होना चाहिए?

+0

आप (शून्य == लिंग) के लिए ले जा रहे हैं? इसके लिए भी, न केवल कुछ समय पर्याप्त है –

+1

नहीं, यह पर्याप्त नहीं है। गतिविधि समाप्त हो सकती है लेकिन लिंग अभी भी शून्य नहीं हो सकता है, और इसका संदर्भ देने का प्रयास विफल हो जाएगा क्योंकि दृश्य/विंडो अब सक्रिय नहीं है। – AgileYogi

1

हालांकि, मैंने कभी इस परिदृश्य का सामना नहीं किया है; मैं आपके प्रश्न का उत्तर देने की कोशिश करूंगा।

अपने मामले में आपको Context को AsyncTask पर सत्यापित करने की आवश्यकता होगी।

आप सत्यापन

if(null!=mContext) //Activity still exist!! 
{ 
    gender.setText(values[0]); 
} 
else //Activity is destroyed 
{ 
    //Take appropriate action!! 
} 

लाभ हो जाएगा, अगर गतिविधि बार जब आप इस बयान तक पहुँचने के द्वारा नष्ट हो जाता है, अपने Context स्वचालित रूप से null हो जाएगा और आप परिदृश्य संभाल कर सकते हैं कर सकते हैं।

+2

यह काम नहीं करेगा। क्योंकि आप गतिविधि के लिए कठोर संदर्भ रखते हैं, इसे हटाया नहीं जाएगा। यह अमान्य हो जाएगा, लेकिन async कार्य गतिविधि के संदर्भ में जारी रहेगा। – uthark

1

मुझे लगता है कि आप जोर देते हैं जाएगा कि यदि आप गतिविधि नहीं चल रहे हैं तो आप AsyncTask को क्यों रद्द नहीं करते हैं? यह एक बेहतर और व्यवहार्य समाधान होगा। यदि आप एप्लिकेशन चल रहे हैं तो आप एक गतिविधि से दूसरी गतिविधि में जाते हैं तो यह AFAIK त्रुटि नहीं देगा।

लेकिन, मुझे AsyncTask रद्द करने के लिए तो you'r गतिविधि, नहीं चल रहा है आप जाँच कर सकते हैं AsyncTask या नहीं चल रहा है जोर देते हैं,

if(task != null && task.equals(AsyncTask.Status.RUNNING)) 
task.cancel(true); 
2

if (!isFinishing()) { 
    gender.setText(values[0]); 
} 
5

मैं एक ऐसी ही था की कोशिश करो समस्या - उपयोगकर्ता ने खंड को नष्ट करने के बाद अनिवार्य रूप से एक एएनपीसी कार्य में एनपीई प्राप्त कर रहा था। स्टैक ओवरफ़्लो पर समस्या पर शोध के बाद, मैं निम्नलिखित समाधान अपनाया: फिर

volatile boolean running; 

public void onActivityCreated (Bundle savedInstanceState) { 

    super.onActivityCreated(savedInstanceState); 

    running=true; 
    ... 
    } 


public void onDestroy() { 
    super.onDestroy(); 

    running=false; 
    ... 
} 

, मैं जाँच ", तो उनका प्रदर्शन" समय-समय पर मेरी async कोड में। मैंने तनाव का परीक्षण किया है और अब मैं अपनी गतिविधि को "तोड़ने" में असमर्थ हूं। यह पूरी तरह से काम करता है और एसओ पर देखे गए कुछ समाधानों की तुलना में सरल होने का लाभ है।

+0

आपको बहुत धन्यवाद !!! मुझे अंत में यह काम करने के लिए मिला है!!! – sshashank124

+1

यह आसान है और वास्तव में समझ में आता है :) अगर कोई उस 'अस्थिर' कीवर्ड के बारे में सोच रहा है, तो इसे पढ़ें: http://stackoverflow.com/a/107040/4331787 –

1

पर Android डेवलपर पता चलता है एक प्रशिक्षण के this भाग के रूप में यूआई तत्व के बाद काम किया है और अगर संदर्भ उपयोग करने से पहले null है जाँच को अपडेट किए जाने की जरूरत है कि एक WeakReference रहते हैं। इससे न केवल यह जांचने में मदद मिलती है कि यूआई अभी भी आसपास है या नहीं, बल्कि यूआई तत्वों को कचरा होने से भी रोका नहीं जाता है।

1

चेक गतिविधि चल रहा है या नहीं

if (!isFinishing()) { 
    // Do whatever you want to do 
} 
संबंधित मुद्दे