2014-10-17 10 views
6

मेरे पास ActivityA है, जिसमें एक बटन है। button पर क्लिक करने पर, यह एक और ActivityB खोलता है।एंड्रॉइड: बैक बटन दबाएं जबकि AsyncTask चल रहा है

onCreate()ActivityB की विधि, मैं AsyncTask शुरू कर रहा हूं जो सर्वर से कनेक्ट होता है और परिणाम लाता है और इसे स्क्रीन पर प्रदर्शित करता है।

public class ActivityB extends Activity { 
    AsyncFetch asyncFetch; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     if(null != savedInstanceState) { 
      return; 
     } 
     asyncFetch = new AsyncFetch(); 
     asyncFetch.execute(); 
    } 
} 


private class AsyncFetch extends AsyncTask<Object, Void, Object> { 
    @Override 
    protected void onPostExecute(Object o) { 

    } 

    @Override 
    protected Object doInBackground(Object... params) { 
     //contacts the http server. 
    } 
} 

AsyncFetch को क्रियान्वित करते हैं, जब मैं प्रेस पलटवार, ActivityB तुरंत नष्ट नहीं हो रही है:

यहाँ Activity B संहिता है। लेकिन AsyncTask पूरा होने के बाद नष्ट हो जाता है।

बैक प्रेस फ्रीज से बचने के लिए मैं इसे कैसे कार्यान्वित कर सकता हूं? मैं नीचे करने की कोशिश की:

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

लेकिन फिर भी यह AsyncTask को रद्द करने या पूरा करने के लिए इंतजार कर रहा है।

GMail ऐप की तरह, जब मैं कुछ खोलता हूं। प्रक्रिया में रहते हुए यदि मैं वापस बटन दबाता हूं, तो यह उस Activity से बाहर आता है।

क्या पृष्ठभूमि प्रक्रिया को लागू करने का कोई अन्य तरीका है? इसे लागू करने के लिए कोई भी design pattern? कृपया मुझे बताओ।

किसी भी मदद की सराहना की जाती है।

+0

क्या आपको बैककी दबाए जाने पर भी सर्वर से उस प्रतिक्रिया की आवश्यकता होगी ?? – Elltz

+0

AsyncTasks सही ढंग से लागू होने पर UI थ्रेड को अवरुद्ध नहीं करते हैं। अपना पूरा कोड पोस्ट करें। – biegleux

+0

यूआई अवरुद्ध नहीं हो रहा है। लेकिन एसिंक पूरा होने तक गतिविधि नष्ट नहीं हो रही है। – User12111111

उत्तर

2

इस प्रयास करें:

@Override 
public void onBackPressed() { 
    asyncFetch.cancel(true); 
    // If you want to finish the activity you can use below code 
    // finish(); 
} 
+0

हां, मैंने भी वही कोशिश की लेकिन अभी भी वही व्यवहार किया। – User12111111

4

बस अपने आप को संभाल onBackPressed() विधि:

@Override 
public void onBackPressed() 
{ 
    if (asyncFetch != null) 
     asyncFetch.cancel(true); 

    super.onBackPressed(); 
} 
+0

हाँ, मैंने कोशिश की लेकिन अभी भी व्यवहार – User12111111

0

यहाँ हम चले। इसे इस्तेमाल करे।

@Override 
public void onBackPressed() { 
    if (asyncFetch.getStatus() == AsyncTask.Status.RUNNING) { 
     asyncFetch.cancel(true); 
    } 
    finish(); 
} 
+1

क्या आप सुनिश्चित हैं कि आपने सुपर के बिना कोशिश की है। बैकप्रेस(); शुरुआत में? –

+0

मैंने कोशिश की, लेकिन फिर भी मैं इस मुद्दे को देखता हूं। एफवाईआई, मैं AsyncTast में क्या कर रहा हूं HTTP संचार है। मैं HTTP क्लाइंट के माध्यम से सर्वर से कनेक्ट कर रहा हूँ। Http की प्रक्रिया में, बैक प्रेस केवल एसिंक कार्य बंद होने तक फिनिश() विधि पर प्रतीक्षा करें। – User12111111

3

एंड्रॉयड डेवलपर के website से:

एक कार्य

एक कार्य रद्द कर रहा है (बुलियन) को रद्द लागू करके किसी भी समय रद्द किया जा सकता। इस विधि को आमंत्रित करने से बाद में कॉल को रद्द करने के लिए रद्द कर दिया जाएगा() सत्य लौटने के लिए। इस विधि को आविष्कार करने के बाद, ऑन-बैकग्राउंड (ऑब्जेक्ट) के बजाय ऑनस्टैक्ल (ऑब्जेक्ट) पर, इनबॉक्स बैकग्राउंड (ऑब्जेक्ट []) के बाद लागू किया जाएगा। यह सुनिश्चित करें कि किसी कार्य को जल्दी से जल्दी रोक दी गई है, तो आप हमेशा isCancelled (के रिटर्न मान) समय-समय पर doInBackground से जांच होनी चाहिए ([] वस्तु), यदि संभव हो तो (उदाहरण के लिए एक पाश के अंदर।)

तो में संक्षेप में, आप AsyncTask को onPause() या onBackPressed() में अपने Activity से रद्द कर सकते हैं, और फिर doInBackground() में ब्लॉक अगर कुछ तोड़ सकते हैं और कार्य रद्द होने पर तुरंत वापस लौट सकते हैं।

उदाहरण के लिए:

@Override 
protected void doInBackground(Object... params){ 

    // do some work 

    if(isCancelled()){ 
     // end task right away 
     return null; 
    } 
    // if task is not cancelled yet, 
    // do some other work 
} 

हालांकि, अगर नेटवर्क आपरेशन पहले से ही शुरू हो गया है, तो आप अपने HttpClient से इसे रद्द करने की आवश्यकता होगी।

-1

जब आप click पीछे button, इसे पहले onBackPressed() कहा जाएगा, इसलिए इस भाग में, asynctask को रद्द करें।

@Override 
public void onBackPressed() { 
    if (asyncFetch != null && asyncFetch.getStatus() == AsyncTask.Status.RUNNING){ 
     asyncFetch.cancel(true); 
    } 
} 
+0

हां, मैंने कोशिश की लेकिन अभी भी वही व्यवहार किया। – User12111111

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