2012-04-05 3 views
6

मैं किसी भी ध्यान में न आया अपवाद के माध्यम से अपने आवेदन में होते निपटने हूँ:मैं बिना किसी निष्कासन को संभालने के बाद ज़ोंबीफाइंग से अपने एप्लिकेशन को कैसे रोकूं?

Thread.setDefaultUncaughtExceptionHandler(this); 

थे यह मेरा लांचर गतिविधि UncaughtExceptionListener को लागू है। मैं अपवाद को संभालता हूं और इसे अपने लॉग सर्वर पर भेजता हूं, ठीक है, हालांकि, मेरा आवेदन तब समाप्त नहीं होता है। जब तक घर या बैक बटन दबाया जाता है तब तक यह ज़ोंबी के साथ चलता है। अपवाद को संभालने के बाद मैं प्रक्रिया को कैसे मार सकता हूं?

संपादित
यहाँ एक परीक्षण और काम करने वाली गतिविधि न आया हुआ अपवाद है कि (धागा) के द्वारा पकड़ा जा करने के लिए और नियंत्रित किया फेंकता है। टोस्ट कभी पोस्ट नहीं किया जाता है और अपवाद लॉग होने के बाद प्रक्रिया ज़ोंबी जाती है।

class TestActivity extends Activity implements UncaughtExceptionListener { 

    @Override public void onCreate(Bundle icicle) { 
     super.onCreate(icicle); 

     Thread.setDefaultUncaughtExceptionHandler(this); 
     throw new RuntimeException("I'm a destuctive booger."); 

     setContentView(R.layout.activity_test); 
    } 

    @Override public void uncaughtException(Thread thread, Throwable toss) { 
     Log.e(TAG, "An uncaught exception has been recieved.", toss); 
     Toast.makeText(this, "Big Error", Toast.LENGTH_LONG).show(); 
    } 
} 
+0

हैंडलर विधि में 'फिनिश() 'कॉल करें। आप शायद उपयोगकर्ता को सूचित करने के लिए पॉपअप संवाद भी प्रदान करना चाहते हैं। – Squonk

+0

@MisterSquonk, नहीं, मेरा संदर्भ बाहर निकाला गया है। मैंने शुरुआत में इसे एक महत्वपूर्ण त्रुटि संदेश टोस्ट किया था, लेकिन टोस्ट नहीं बनाएगा। मैंने फिर एक प्रसारण रिसीवर की कोशिश की और यह भी काम नहीं किया। – AedonEtLIRA

+1

क्षमा करें, मुझे समझ में नहीं आता है। आप कहते हैं कि 'यह' आपका लॉन्चर 'गतिविधि' है, इसलिए यदि हैंडलर विधि' गतिविधि 'का हिस्सा है, तो इसे संभालने के लिए आपके पास' चल रहा 'गतिविधि होना चाहिए। तथ्य यह है कि 'गतिविधि'' संदर्भ 'का एक अप्रत्यक्ष उप-वर्ग है (ओओपी शर्तों में) एक' गतिविधि 'एक' संदर्भ 'है। – Squonk

उत्तर

1

मैं अपने उदाहरण कोड के साथ कुछ परीक्षण किया और पाया कि finish()uncaughtException() से काम करेंगे। यह चुप है हालांकि उपयोगकर्ता को कोई प्रतिक्रिया नहीं देती है, और आप की तरह, मैं Toast या getApplicationContext() का उपयोग करके किसी भी अन्य दृश्य संदेश बॉक्स को आमंत्रित करने में असमर्थ था।

किसी भी प्रतिक्रिया है कि मैं काम कर पाने में सक्षम था भेजने का एक ही तरीका है एक स्थिति पट्टी NotificationContext के लिए getApplicationContext() का उपयोग कर भेजने के लिए NotificationManager उपयोग करने के लिए किया गया था।

मैंने इस पर अधिक समय नहीं लगाया लेकिन दुर्भाग्य से ऐसा लगता है कि उपयोगकर्ता को अधिसूचना पर क्लिक करने पर संभालने के लिए PendingIntent प्रदान करना है।के लिए सेट Activity एक अनचाहे अपवाद उत्पन्न करता है, तो उसी Activity के साथ ऐसा करने से स्पष्ट रूप से एक अनंत लूप का जोखिम हो सकता है।

हालांकि, संभवतः एक अलग विषय Activity बनाने के लिए संभवतः एक संवाद विषय के साथ खोला जाएगा और दुर्घटना की व्याख्या होगी।

0

सुनिश्चित नहीं हैं कि अगर इस समस्या से निपटने का एक विनम्र तरीका है, लेकिन आप कोशिश कर सकते हैं:

import android.os.Process; 

Process.killProcess(Process.myPid());