2013-08-21 14 views
6

मैं एक नेस्टेड टुकड़ा निम्नलिखित विधि से युक्त है:एंड्रॉइड AsyncTask - क्यों InInBackground() निष्पादित नहीं किया गया है?

public void onSave() { 
    if (getActivity() == null || view == null) return; 
    if (file != null && file.exists()) { 
     new AsyncTask<Void, Void, Void>() { 
      @Override 
      protected void onPreExecute() { 
       Log.d("log", "onPreExecute of save ex"); 
      } 

      @Override 
      protected Void doInBackground(Void... params) { 

       Log.d("log", "doInBackground of save ex"); 
       //DO SOMETHING 
       return null; 
      } 

      protected void onPostExecute(Void result) { 
       BaseFragment fragment = new LocalListFragment(); 
       ((LocalLauncherFragment)(LocalEditFragment.this.getParentFragment())).setFragment(fragment); 
       Log.d("log", "end of save ex"); 
      }; 
     }.execute(); 
    } else { 
     showAlert(); 
    } 
} 

मेरे समस्या यह है कि अगर मैं पहली बार के लिए इस विधि कहते हैं, यह onPostExecute जब तक निष्पादित होता है()। हालांकि अगर मैं दूसरे टुकड़े पर जाता हूं और इस खंड को नया खोलता हूं (एक नया खंड वस्तु बनाकर और इसे बदलकर) तो केवल PreExecute() को निष्पादित किया जाता है। यह asyncTask ऑब्जेक्ट दूसरी बार क्यों निष्पादित नहीं किया जाता है?

जानबूझकर अगर मैं executeOnExecutor() का उपयोग करता हूं तो यह दूसरी बार ठीक काम करता है। लेकिन क्यों निष्पादित() काम नहीं करता है? AsyncTask का जीवन खंड या कुछ से जुड़ा हुआ है?

अग्रिम धन्यवाद!

+0

मैं इस पर निश्चित नहीं हूं, लेकिन टुकड़ों में यूआई घटक हो सकते हैं, इसलिए मैं पृष्ठभूमि धागे में उनके साथ गड़बड़ करने के बारे में सावधान रहूंगा। क्या आपने अपना लॉग स्टेटमेंट 'doInBackground' विधि में पहली पंक्ति के रूप में डालने का प्रयास किया है और देखें कि यह दिखाया गया है या नहीं? – kabuko

+0

हाँ मैंने किया। पहली कोशिश पर, onPreExecute() doInBackground() दोनों को बुलाया जाता है लेकिन दूसरी बार, केवल PReExeucte() पर कॉल किया जाता है :( – user2062024

+0

जब आप 'executeOnExecutor' का उपयोग कर रहे हैं, तो मुझे लगता है कि आप' THREAD_POOL_EXECUTOR' का उपयोग कर रहे हैं और नहीं 'SERIAL_EXECUTOR' सही है?' SERIAL_EXECUTOR' के साथ प्रयास करें और मैं डर दूंगा कि आपको वही (अवांछित) व्यवहार मिलेगा। – kabuko

उत्तर

1

मुझे लगता है कि AsyncTask में कुछ लटक रहा है। एंड्रॉइड AsyncTask के एकल संस्करणों में एक एकल थ्रेड पर चलने तक, जब तक आप Executor निर्दिष्ट नहीं करते हैं जो बहु-थ्रेडेड है। onPreExecute() अभी भी सफलतापूर्वक चलाता है क्योंकि यह मुख्य धागे पर चलता है। आप दूसरी बार doInBackground कभी नहीं देखते हैं क्योंकि एकल पृष्ठभूमि थ्रेड अभी भी पहले कॉल से लटका हुआ है। लटकने के कारण आपको यह देखने के लिए LocalKeekLauncherFragment.setFragment(fragment) की सामग्री की जांच करने की आवश्यकता होगी।

+0

दरअसल खंड की संक्रमण की उन 2 पंक्तियों कोपोस्टएक्सक्यूट() पर होना चाहिए था। मैंने कोड कोड संपादित किया। और फिर भी ... पहली कोशिश पर, onPreExecute(), doInBackgroiund(), onPostExecute() रन। दूसरी कोशिश पर, केवल onPreExecute() चलाता है .. यदि OnPostExecute() पहली कोशिश पर चलता है, तो इसका मतलब है कि AsyncTask पहले पर नहीं लटका था कोशिश करो, है ना? – user2062024

+0

मैं आपसे सहमत हूं कि मेरा AsyncTask अवरुद्ध है क्योंकि मुझे पता चला कि मैंने दूसरी बार भागने के बाद, अन्य सभी हिस्सों जहां AsyncTask.execute() ने काम करना बंद कर दिया था। – user2062024

+0

मैंने इसे निष्पादित करने से पहले asyncTask की स्थिति की जांच की और यह दूसरी कोशिश पर ठीक लगता है .. – user2062024

0

ऐसा लगता है कि डिनबैकग्राउंड थ्रेड शायद दूसरी बार दुर्घटनाग्रस्त हो गया है। यह पहले प्रयास से अटक नहीं रह सकता है जैसे कि पोस्टएक्सक्यूट को बुलाया जाता है और यह केवल तभी संभव है जब DoInBackground ने सफलतापूर्वक मूल्य वापस कर दिया हो।

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