8

में टोस्ट नहीं दिख रहा है, मैं इस कोड का उपयोग किसी भी अपूर्ण अपवाद को संभालने के लिए कर रहा हूं जो मेरे एप्लिकेशन को क्रैश करने का कारण बन सकता है।UnCaughtExceptionHandler

public class ExceptionHandler implements java.lang.Thread.UncaughtExceptionHandler { 
    private final Context myContext; 

    public ExceptionHandler(Context context) { 

     myContext = context; 
    } 

    public void uncaughtException(Thread thread, Throwable exception) { 

     Toast.makeText(myContext, 
       "The application has crashed, and a report is sent to the admin", 
       Toast.LENGTH_SHORT).show(); 
     StringWriter stackTrace = new StringWriter(); 
     exception.printStackTrace(new PrintWriter(stackTrace)); 
     System.err.println(stackTrace);// You can use LogCat too 
     Intent intent = new Intent(myContext, CrashActivity.class); 
     myContext.startActivity(intent); 
     Process.killProcess(Process.myPid()); 
     System.exit(10); 
    } 
} 

जब मैं एक ज्ञात लेकिन न आया हुआ अपवाद के साथ इसे चलाने के (सिर्फ परीक्षण करने के लिए), गतिविधि "CrashActivity" कहा जाता है लेकिन टोस्ट जो यह पहले आना चाहिए नहीं दिखा रहा है।

वास्तव में मैं केवल टोस्ट दिखाना चाहता था और फिर myContext.finish() को कॉल करना चाहता था; क्रैशएक्टिविटी पर जाने के बजाए। लेकिन उस टोस्ट दिखाई नहीं दे रहा है।

मैं कहाँ गलत हूँ?

+2

मैं एंड्रॉइड प्रोग्रामर नहीं हूं लेकिन मैंने जो पढ़ा है, उससे टोस्ट को यूआई थ्रेड पर कॉल नहीं किया जाना चाहिए? आप किस मामले में यूआई थ्रेड पर इसका आह्वान कर रहे हैं? मैं अनुमान लगाता हूं कि शायद आपने पहले ही इस बारे में सोचा था। –

+0

हाँ आप सही हैं..मैं ui धागे पर टोस्ट नहीं बुला रहा हूं :( –

उत्तर

3

आप शायद एक धागे से टोस्ट बुला रहे हैं, जबकि एक टोस्ट यूआई धागे से बुलाया जाना चाहिए ...

इस तो मदद नहीं कर रहा है, हमें logcat आउटपुट प्रदान करें ताकि हम किस तरह देख सकते हैं आपको मिल रही त्रुटि

+0

हाँ, मैं टोस्ट को एक अलग थ्रेड में उपयोग करने में गलत हूं। दरअसल मैंने इसे एक ऐसे एप्लिकेशन में देखा जहां ऐप दुर्घटनाग्रस्त हो जाता है, यह एक टोस्ट दिखाता है एक ही गतिविधि। क्या यह वास्तव में एक ही गतिविधि को याद करता है और फिर टोस्ट दिखाता है ?? –

7

एक ही समस्या के लिए googling जबकि यह सवाल मिला। जहां तक ​​मैं कह सकता हूं कि यूआई थ्रेड से Toast.show() को तब तक जरूरी नहीं है जब तक कोई एप्लिकेशन संदर्भ न हो।

AFAIK: यहां जो समस्या होती है वह निम्न है: आप टोस्ट दिखाने की कोशिश कर रहे हैं और तुरंत बाद में आपका आवेदन वीएम द्वारा बंद कर दिया गया है, जिसका अर्थ है कि आपका टोस्ट भी बंद हो गया है।

समस्या के लिए एक समाधान है निम्नलिखित:

  • न आया हुआ अपवाद हैंडलर में
  • देरी अपने आवेदन के बंद एक sepearate थ्रेड से टोस्ट चलाएँ।

मैं क्या है निम्नलिखित:

Application::onCreate() में:

Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler() { 
    @Override 
    public void uncaughtException(Thread thread, Throwable ex) 
    { 
     new Thread() { 
      @Override 
      public void run() { 
       Looper.prepare(); 
       Toast.makeText(getApplicationContext(), "Application crashed", Toast.LENGTH_LONG).show(); 
       Looper.loop(); 
      } 
     }.start(); 

     try 
     { 
      Thread.sleep(4000); // Let the Toast display before app will get shutdown 
     } 
     catch (InterruptedException e) 
     { 
      // Ignored. 
     } 
    } 
}); 

यह करने के लिए कैसे काम करता है ACRA में टोस्ट अधिसूचना (वास्तव में यह वह जगह है जहाँ मैं से संकेत मिला है) समान है ।

+0

यह वही था जो मुझे चाहिए क्योंकि मैं अपवाद के कुछ विवरण देखने के लिए एक त्वरित (अस्थायी) तरीका चाहता था। मैंने पाया कि मुझे भी रखना पड़ा 'पकड़' ब्लॉक के बाद 'System.exit()' कॉल में।क्या यह उपरोक्त में गायब है? – darrenp

+0

पुजू। अच्छा प्रश्न। मैं 'System.exit()' से बाहर नहीं निकलता हूं लेकिन '_androidDefaultUncaughtExHandler.uncaughtException (थ्रेड, पूर्व) के साथ डिफ़ॉल्ट अपवाद हैंडलर का उपयोग करता हूं; और इसे' _androidDefaultUncaughtExHandler = Thread.getDefaultUncaughtExceptionHandler(); – GeneSys

+1

के साथ सेट करना समझ में आता है। डिफ़ॉल्ट अपवाद हैंडलर को व्यवस्थित करना होगा और 'System.exit() 'को कॉल करना होगा। – darrenp

3

एंड्रॉइड UncaughtExceptionHandler के भीतर से System.exit(0) पर कॉल करने से एप्लिकेशन को त्रुटि से पुनर्प्राप्त करने और अंतिम गतिविधि को फिर से लॉन्च करने में सहायता मिलती है। आईएमएचओ, उपयोगकर्ता अनुभव में काफी सुधार हुआ है। हालांकि, इस दृष्टिकोण को कई एंड्रॉइड प्लेटफ़ॉर्म पर परीक्षण और परीक्षण करने की आवश्यकता है। जीबी और जेबी पर यह कोशिश की है। यह ठीक काम किया। इसके अतिरिक्त, मैंने दूसरों से सुना है (मैं एंड्रॉइड के लिए नया हूं) एंड्रॉइड में System.exit() का आविष्कार नहीं किया गया है, लेकिन एंड्रॉइड एप्लिकेशन क्रैश के लिए इसे एक अच्छा वसूली विकल्प के रूप में उपयोग कर सकता है।

public void uncaughtException(Thread thread, Throwable ex) { 
     new Thread() { 
      @Override 
      public void run() { 
       Looper.prepare(); 
       Toast.makeText(YourActivity.this, "Application has Crashed. Recovering now.", Toast.LENGTH_LONG).show(); 
       /* Log relevant message/analytics from here. */ 
       System.exit(1); 
       Looper.loop(); 
      } 
     }.start(); 
    } 
+0

मैं कैसे कर सकता हूं जब मैं System.exit() को कॉल करता हूं तो ऐप को पुनरारंभ करने से बचें? मैं चाहता हूं कि कोई दुर्घटना होने पर ऐप वास्तव में बंद हो जाए, फिर भी मैं ईवेंट को कैप्चर करना चाहता हूं और ईमेल के माध्यम से डेटा भेजना चाहता हूं ... –

+0

'System.exit() 'ज्यादातर मामलों में ऐप को अचानक बंद कर देगा, जो आम तौर पर है आप क्या चाहते हैं नहीं। ऐप क्रैश हो जाएगा कि आप 'निकास()' कहें या नहीं, इसलिए इसे स्पष्ट रूप से कॉल करने की कोई वास्तविक आवश्यकता नहीं है। – milosmns