2014-04-10 9 views
10

यह एक सामान्य सवाल है, जो विशिष्ट परिदृश्य से उठाया है, लेकिन मैं एक सामान्य जवाब कैसे निम्नलिखित स्थिति से निपटने के प्राप्त करना चाहते हैं:पृष्ठभूमि थ्रेड में अपवाद के कारण एंड्रॉइड ऐप को क्रैश होने से कैसे रोकें?

पृष्ठभूमि:

मैं उस ऐप्लिकेशन है जो Google Play Services पर आधारित कुछ तृतीय पक्ष लाइब्रेरी (विज्ञापन नेटवर्क प्रदाता एसडीके - विशेष रूप से - AdMob एसडीके) का उपयोग करना। इस पुस्तकालय की कार्यक्षमता आवेदन के लिए महत्वपूर्ण नहीं है। पुस्तकालय एक या अधिक पृष्ठभूमि कार्यकर्ता धागे बनाता है। कभी-कभी (बहुत दुर्लभ मामला) इन पृष्ठभूमि धागे में से एक में एक अनचाहे अपवाद होता है, जिससे एप्लिकेशन को दुर्घटनाग्रस्त कर दिया जाता है। मैं इस लाइब्रेरी के कारण सभी अपवादों को अनदेखा करना चाहता हूं, उनके कारणों के बावजूद: सबसे खराब स्थिति में ऐप उपयोगकर्ता को कोई विज्ञापन नहीं दिखाई देगा - यह ऐप क्रैश से कहीं बेहतर है।

चूंकि पुस्तकालय स्वयं पृष्ठभूमि धागे बनाता है - मैं उन्हें कोशिश/पकड़ से लपेट नहीं सकता।

प्रश्न

वहाँ सभी गैर संभाला पृष्ठभूमि (गैर मुख्य) धागा अपवाद को पकड़ने के लिए कोई तरीका है और सिर्फ इस तरह के मामले में धागा को मारने के लिए, और एप्लिकेशन दुर्घटना को रोकने के लिए?

संबंधित प्रश्नों

मैं कई सवाल का एक बहुत देखा था, लेकिन उनमें से कुछ बहुत अधिक सटीक हैं (और मेरे मामले को कवर नहीं) है जो डेवलपर धागा निर्माण पर एक नियंत्रण है और है, दूसरों को स्थिति को देखें कोशिश/पकड़ के साथ पूरे धागे को लपेटने में सक्षम। अगर मुझे अभी भी प्रासंगिक प्रश्न याद आ गया है, तो इस मामले को कवर करने के लिए, मैं

+2

आप कार्यकर्ता थ्रेड के लिए एक प्रबंधक को इंस्टॉल करने की कोशिश की और नहीं करने की कोशिश की प्रक्रिया को मारने कक्षा बनाएं? मुझे नहीं पता कि यह संभव है क्योंकि आपके पास क्रैश होने वाले कार्यकर्ता थ्रेड तक पहुंच नहीं हो सकती है। मुझे पता है कि पूरी प्रक्रिया के लिए एक हैंडलर स्थापित करने और ऐप क्रैश होने से पहले एक बग रिपोर्ट संचारित करने के लिए झुकाव प्रबंधन करता है। शायद यह इस मार्ग के माध्यम से करने योग्य है। –

+0

@over_optimistic धन्यवाद! मैंने Thread.setDefaultUncaughtExceptionHandler का उपयोग करने का प्रयास किया और यह एक आकर्षण की तरह काम करता है :)! कृपया इसे उत्तर के रूप में लिखें ताकि मैं इसे स्वीकार कर सकूं –

+1

http://stackoverflow.com/questions/2764394/ideal-way-to-set-global-uncaught-exception-handler-in-android/ – fadden

उत्तर

12

लिंक की सराहना करता हूं, आपको केवल बेस एक्टिविटी के साथ सभी गतिविधियों को विस्तारित करना है। एप्लिकेशन कभी नहीं किसी भी बिंदु

कोड sniplet पर दुर्घटनाओं BaseActivity के लिए:

public class BaseActivity extends Activity{ 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { 
      public void uncaughtException(Thread paramThread, Throwable paramThrowable) { 
       Log.e("Error"+Thread.currentThread().getStackTrace()[2],paramThrowable.getLocalizedMessage()); 
      } 
     }); 
    } 
} 
+0

मुझे लगता है कि इसे रखना बेहतर है यह कोड कस्टम एप्लिकेशन क्लास में है, क्योंकि यह ऐप के जीवनकाल में केवल एक बार चलाने के लिए है –

+1

मेरे ऐप में जोड़ने के बाद, जब भी मेरा ऐप क्रैश हो जाता है तो यह ब्लैक स्क्रीन पर फंस जाता है। कृपया इस पर मेरी सहायता करें –

2

ऊपर उल्लेख किया है, Thread.setDefaultUncaughtExceptionHandler इस संभाल करने के लिए उचित तरीका है।

private class MyThreadUncaughtExceptionHandler implements Thread.UncaughtExceptionHandler { 

    @Override 
    public void uncaughtException(Thread thread, Throwable ex) { 
     Log.e(TAG, "Received exception '" + ex.getMessage() + "' from thread " + thread.getName(), ex); 
    } 
} 

फिर अपने मुख्य थ्रेड से setDefaultUncaughtExceptionHandler फोन:

Thread t = Thread.currentThread(); 
t.setDefaultUncaughtExceptionHandler(new MyThreadUncaughtExceptionHandler()); 
संबंधित मुद्दे