当前位置: 首页 > 面试题库 >

如何防止android应用由于后台线程异常而崩溃?

王英奕
2023-03-14
问题内容

这是一个普遍的问题,是从特定情况提出的,但我想获得一个一般性的答案,说明如何处理以下情况:

背景:

我有一个应用程序,它在使用一些第三方库(广告网络提供商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());
            }
        });
    }
}


 类似资料:
  • 当我尝试更新应用程序时,应用程序崩溃了。在我们的应用程序中,我们正在缓存中保存更新的版本,然后尝试从缓存中安装应用程序。应用程序由于android.os.fileuriexposedexception而崩溃。我发现通过intent.getData()在应用程序之外公开了日志android.os.fileuriexposedexception:file:///storage/emulated/0/t

  • 即使在谷歌搜索了几个小时后,我也无法找出确切的问题。我已经检查了StackOverflow本身的几个答案,但未能找出问题所在。 错误跟踪如下: 主要活动代码: 更新1:我已经做了答案中建议的所有更改,但每当我单击MainActivity中的“跳过指令”按钮时,我的应用程序仍然崩溃。此外,当我从AdminLogin活动中单击“登录”按钮时,应用程序崩溃。我该怎么办? Update2:我提到了什么是N

  • 当我在1到9之间选择一个数字并在控制台中输入一个数字时,该方法会工作并进行正确的移动。但我的问题是如何避免当我输入一个字母而不是一个数字时,程序就崩溃了。

  • 我让我的学长给我解释,他说, 这是为了防止生产中的崩溃。 我完全不同意。对我来说,这不是防止应用程序崩溃的方法。这表明开发人员不知道他/她在做什么,并有疑问。 由于这个问题得到了很多关注,有些人误解了这个问题(可能是因为我没有清楚地表达它),我打算重新表达它。 以下是开发人员在这里所做的 > 编写并测试一个函数,它可以是一个只是初始化视图的小函数,也可以是一个复杂的函数,测试后它被包裹在块中。即使

  • 想想一个大项目,它处理由它自己的goroutine处理的大量并发请求。碰巧代码中有一个bug,其中一个请求会因为引用为nil而引起恐慌。 在Java、C#和许多其他语言中,这最终会导致异常,异常会停止请求,而不会对其他正常的请求造成任何损害。在围棋中,这会破坏整个程序。 AFAIK,对于每一个新的go例程创建,我都必须有。这是防止整个程序崩溃的唯一方法吗? 更新:为每个gorouting创建添加调

  • 我编写了一个Java应用程序,它使用JNI调用自定义的本机库。这个库工作得很好,我们可以通过它来处理小数据数组。但是,较大的数据数组会导致致命错误(EXCEPTION_STACK_OVERFLOW)。应用程序的核心转储显示了违规函数_chkstk。显然,当函数中有多页局部变量时,编译器会调用_chkstk。 通过快速搜索,我找到了Oracle的网站,该网站详细描述了4.1.3堆栈溢出导致的崩溃,并