15

हैंडलिंग 0 पृष्ठभूमि प्रतिक्रियाओं को करने के लिए मैं AsyncTask का उपयोग कर रहा हूं लेकिन अपवादों को संभालने के लिए मैं सही तरीका नहीं ढूंढ पा रहा हूं।Asynctask त्रुटि

private class MyTask extends AsyncTask<String, Void, String> 
{ 
    private int e = 0; 

    @Override 
    protected String doInBackground(String... params) 
    { 
     try 
     { 
      URL url = new URL("http://www.example.com/"); 
     } 
     catch (MalformedURLException e) 
     { 
      e = 1; 
     } 

     // Other code here... 

     return null; 
    } 

    @Override 
    protected void onPostExecute(String result) 
    { 
     if (e == 1) 
      Log.i("Some Tag", "An error occurred."); 

     // Perform post processing here... 
    } 
} 

मुझे विश्वास है कि चर ई maye लिखा/दोनों मुख्य और कार्यकर्ता धागा द्वारा पहुँचा जा: वर्तमान में मैं निम्नलिखित कोड का उपयोग कर रहा हूँ। जैसा कि मुझे पता है कि onPostExecute() केवल doInBackround() के बाद चलाया जाएगा, क्या मैं कोई सिंक्रनाइज़ेशन छोड़ सकता हूं?

क्या यह बुरा कोड है? AsyncTask में अपवादों को संभालने के लिए कोई सहमति या सही तरीका है?

+1

संभव डुप्लिकेट (http://stackoverflow.com/questions/1739515/asynctask-and-error-handling-on-android) – blahdiblah

उत्तर

3

मैं अपने ऐप्स में ऐसा कर रहा हूं, मुझे लगता है कि कोई बेहतर तरीका नहीं है।

आप इसके बारे में Mark Murphy answer भी पढ़ सकते हैं।

+0

यदि यह कोई कारण बनता है समस्याएं तो मैं खुश हूँ! – Leo

2

यह एसएमपी आर्किटेक्चर पर भी काम करने की गारंटी है। आपके लिए सभी सिंक्रनाइज़ेशन किया जाता है। हालांकि ऐसा करने के लिए रिटर्न वैल्यू का उपयोग करना बेहतर होगा।

+1

वास्तविक कोड में मैं एक कस्टम ऑब्जेक्ट का उपयोग रिटर्न प्रकार के रूप में कर रहा हूं जो वास्तव में अपवाद जानकारी रखने के लिए खुद को उधार नहीं देता है। मुझे लगता है कि मैं 'onPostExecute()' फ़ंक्शन को आसानी से अधिभारित नहीं कर सकता? – Leo

+4

सबसे पहले, doInBackground को उसी प्रकार की ऑब्जेक्ट को वापस करना चाहिए जैसा कि PostExecute() में पैरामीटर के रूप में है। फिर आप परिणाम + अपवाद को समाहित करने के लिए एक कस्टम क्लास बना सकते हैं: कक्षा परिणामहोल्डर {अपवाद ई; MyResult आर; } –

2

मुझे लगता है कि आपका कोड नौकरी के लिए होगा, लेकिन पहले से ही AsyncTask कक्षा में निर्मित कुछ प्रकार की त्रुटि हैंडलिंग है।

आप cancel() विधि और उसके हैंडलर विधि onCancelled() का उपयोग करके एक अतिरिक्त चर का उपयोग करने से बच सकते हैं। जब आप यूआई थ्रेड में 0Cविधि को रद्द कर देते हैं तो रद्द करें। चाहे आप रद्द करें (सत्य) या रद्द करें (झूठी) आपकी आवश्यकताओं पर निर्भर करता है।


private class MyTask extends AsyncTask<String, Void, String> 
{  
    @Override 
    protected NewsItem doInBackground(String... params) 
    { 
     try 
     { 
      URL url = new URL("http://www.example.com/"); 
     } 
     catch (MalformedURLException e) 
     { 
      cancel(false/true); 
     } 

     // Other code here... 

     return null; 
    } 

    @Override 
    protected void onPostExecute(String result) 
    {    
     // Perform successful post processing here... 
    } 

    @Override 
    protected void onCancelled() { 
     super.onCancelled(); 
     // Perform error post processing here... 
    } 
} 
[AsyncTask और त्रुटि Android पर से निपटने] की
+0

यह विधि केवल तभी काम करती है जब हमारे पास एक प्रकार का अपवाद हो। मेरे पूर्ण कोड में कई चीजें हैं जो गलत हो सकती हैं और उन्हें अलग-अलग संभाला जाना चाहिए। – Leo

+0

क्यों? आप जितना चाहें उतना कैच-क्लास जितना प्रयास कर सकते हैं। प्रत्येक कैच-कथन में आप रद्द-विधि को कॉल कर सकते हैं। आप भी (अपवाद ई) पकड़ सकते हैं जो सभी प्रकार के अपवादों को पकड़ता है। क्या मैंने आपको सही किया, लियो? हालांकि, क्या रद्द करने के लिए यह अच्छा अभ्यास है() जब अपवादों को फेंक दिया जाता है या क्या अपवाद प्रबंधन का एक और तरीका लागू किया जाता है? – OneWorld

+0

त्रुटि को संभालने का रद्द() तरीका वास्तव में क्या होता है इसके बहुत करीब है। त्रुटि के कारण आपकी प्रसंस्करण रद्द कर दी गई है। आप अभी भी कुछ राज्य को ASyncTask पर सहेज सकते हैं जिसे यूआई थ्रेड द्वारा पढ़ा जा सकता है ताकि त्रुटि क्या हो सके। – DukeMe

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