如何防止Android应用程序由于后台线程中的异常而崩溃?

2022-09-03 13:21:45

这是一个从特定场景中提出的一般问题,但我想得到一个一般的答案,如何处理以下情况:

背景:

我有一个应用程序,它正在使用一些第三方库(广告网络提供商SDK - 特别是 - SDK,基于)。此库的功能对于应用程序并不重要。该库创建一个或多个后台工作线程。有时(非常罕见的情况)在这些后台线程之一中存在未处理的异常,导致应用程序崩溃。我想忽略由此库引起的所有异常,无论其原因如何:在最坏的情况下,应用程序用户将看不到广告 - 这比应用程序崩溃要好得多。AdMobGoogle Play Services

由于库本身创建了后台线程 - 我不能只是通过try/catch来包装它们。

问题

有没有办法捕获所有未处理的后台(非主)线程异常,并在这种情况下终止线程,并防止应用程序崩溃?

相关问题

我看到了很多几个问题,但其中一些问题太具体了(并且没有涵盖我的情况),其他问题指的是开发人员可以控制线程创建并且能够用 try/catch 包装整个线程的情况。如果我仍然错过了相关问题,涵盖此案例,我将不胜感激链接


答案 1

您需要做的就是使用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());
            }
        });
    }
}

答案 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());

推荐