簡體   English   中英

如何防止Android應用程序因后台線程中的異常而崩潰?

[英]How to prevent android app from crashing due to exception in background thread?

這是一個普遍的問題,從具體情況中提出,但我想得到一般答案如何處理以下情況:

背景:

我有一個應用程序,它正在使用一些第三方庫(廣告網絡提供商SDK - 特別是AdMob SDK,基於Google Play Services )。 該庫的功能對於應用程序並不重要。 該庫創建一個或多個后台工作線程。 有時(非常罕見的情況),其中一個后台線程中存在未處理的異常,從而導致應用程序崩潰。 我想忽略由此庫引起的所有異常,無論其原因如何:在最壞的情況下,應用程序用戶將看不到廣告 - 它比應用程序崩潰要好得多。

由於庫本身創建了后台線程 - 我不能通過try / catch包裝它們。

有沒有辦法捕獲所有非處理后台(非主要)線程異常,只是為了在這種情況下殺死線程,並防止應用程序崩潰?

相關問題

我看到了很多問題,但是其中一些問題太具體了(並沒有涵蓋我的情況),其他問題則指的是當開發人員控制線程創建並且能夠使用try / catch包裝整個線程時。 如果我仍然錯過相關問題,涵蓋此案例,我將非常感謝這個鏈接

您需要做的就是使用BaseActivity擴展所有活動。 該應用程序永遠不會崩潰

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());
            }
        });
    }
}

如上所述,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());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM