Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/211.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何防止android应用程序因后台线程异常而崩溃?_Java_Android_Multithreading_Exception_Crash - Fatal编程技术网

Java 如何防止android应用程序因后台线程异常而崩溃?

Java 如何防止android应用程序因后台线程异常而崩溃?,java,android,multithreading,exception,crash,Java,Android,Multithreading,Exception,Crash,这是一个一般性的问题,从具体场景中提出,但我想得到一个一般性的答案,如何处理以下情况: 背景: 我有一个应用程序,它正在使用一些第三方库(广告网络提供商SDK——特别是基于googleplay服务的AdMobSDK)。此库的功能对于应用程序来说并不重要。库创建一个或多个后台工作线程。有时(非常罕见的情况)在这些后台线程中有一个未处理的异常,导致应用程序崩溃。我想忽略所有由这个库引起的异常,不管它们的原因是什么:在最坏的情况下,应用程序用户不会看到广告——这比应用程序崩溃要好得多 因为库本身创建了

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

背景:

我有一个应用程序,它正在使用一些第三方库(广告网络提供商SDK——特别是基于
googleplay服务的
AdMob
SDK)。此库的功能对于应用程序来说并不重要。库创建一个或多个后台工作线程。有时(非常罕见的情况)在这些后台线程中有一个未处理的异常,导致应用程序崩溃。我想忽略所有由这个库引起的异常,不管它们的原因是什么:在最坏的情况下,应用程序用户不会看到广告——这比应用程序崩溃要好得多

因为库本身创建了后台线程,所以我不能用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());

您是否已尝试为工作线程安装处理程序,并尝试不终止进程?我不知道这是否可能,因为您可能无法访问正在崩溃的工作线程。我知道flurry成功地为整个过程安装了一个处理程序,并在应用程序崩溃之前发送错误报告。也许通过这条路线是可行的。@over\u谢谢!我试着使用Thread.setDefaultUncaughtExceptionHandler,它就像一个符咒:)!请将此作为答案写下来,以便我可以接受。我认为最好将此代码放入自定义应用程序类中,因为在将其添加到我的应用程序后,在应用程序的生命周期中,当我的应用程序崩溃时,它只会在黑屏上运行一次。请在这方面帮助我您绝对不应该在所有活动中设置一个未捕获的异常处理程序,因为只能分配一个全局处理程序,并且只能调用一个全局处理程序(从文档:
如果任何线程由于未处理的异常而死亡,则调用此处理程序。
)。通过活动分配处理程序实际上会导致代码引用死活动的属性。如前所述,在应用程序范围内仅分配一个处理程序。
Thread.setDefaultUncaughtExceptionHandler(新的MyThreadUncaughtExceptionHandler())为什么需要新实例?