2012-07-01 60 views
4

CustomExceptionHandler是,setDefaultUncaughtExceptionHandler使應用程序崩潰默默

public class CustomExceptionHandler implements UncaughtExceptionHandler { 

private Context ctx; 
private ContentResolver cr; 

public CustomExceptionHandler(Context ctx, ContentResolver cr) { 
    this.ctx = ctx; 
    this.cr = cr; 
} 

public void uncaughtException(Thread t, Throwable e) { 

    final Writer result = new StringWriter(); 
    final PrintWriter printWriter = new PrintWriter(result); 
    e.printStackTrace(printWriter); 
    String stacktrace = result.toString(); 
    printWriter.close(); 


    String deviceUuid = Utilities.DeviceUuid(ctx, cr); 
    String bluetoothName = Utilities.LocalBluetoothName(); 

    AsyncTasks.ErrorLogTask logTask = new AsyncTasks.ErrorLogTask(e, bluetoothName, deviceUuid, stacktrace); 
    logTask.execute(); 
} 




} 

從我的主要活動名爲:

Thread.setDefaultUncaughtExceptionHandler(new CustomExceptionHandler(getBaseContext(), getContentResolver())); 

當有異常情況,現在情況發生時,我沒有拿到常規 「不幸的是,已停止」彈出。它只是一個黑色的屏幕。如果我從我的主要活動中刪除了我的電話,換句話說不再使用CustomExceptionHandler,我將獲得默認行爲。

是否有任何方法來實現我的班級中的默認錯誤行爲?

在此先感謝!

+0

我有同樣的問題,最近解決了。這是我的[原文](https://stackoverflow.com/questions/46070393/replacing-default-uncaught-exception-handler-to-avoid-crash-dialog) –

回答

3

您可以添加在您的異常處理程序結束下列獲得「不幸的是已停止」對話框:

System.exit(1); 

然而,這將導致進程終止,這意味着你的AsyncTask將無法運行完成。

無論如何,如果您處於uncaughtExceptionHandler中,我會懷疑您的代碼是否可以可靠地運行,因爲您不知道應用程序的狀態。它可能工作,但它可能不會。你也可以嘗試的是在你的uncaughtExceptionHandler中創建一個新的線程,讓該線程休眠一會兒,然後使用System.exit()終止應用程序。這可能會讓您的AsyncTask足夠的時間運行完成。

+0

謝謝,但我不是猜測什麼時候事情的粉絲完成。我讀過一些這樣的事情可能會有所幫助? 'previousHandler = Thread.getDefaultUncaughtExceptionHandler();' – Johan

+0

當然,在設置uncaughtExceptionHandler之前,您可以保存對前一個處理程序的引用。然後,在'uncaughtException'中的代碼末尾,你可以調用'previousHandler.uncaughtException(t,e);'(假設它是非空的)。但是,效果是一樣的。你的進程將立即終止,這將不會讓你的AsyncTask有機會運行。如果這是你想要的行爲,你可以完全移除你的uncaughtException處理程序,只使用默認行爲。 –

+0

好吧,因爲它現在正在處理您的代碼段。而我的asynctask仍然會向我的服務發佈數據。這怎麼可能? – Johan