这是一个普遍的问题,从具体情况中提出,但我想得到如何处理以下情况的一般性答案:
背景
我有一个应用,它正在使用一些第三方库(广告网络提供商SDK - 特别是 - AdMob
SDK,基于Google Play Services
)。该库的功能对于应用程序并不重要。该库创建一个或多个后台工作线程。有时(非常罕见的情况),其中一个后台线程中存在未处理的异常,从而导致应用程序崩溃。我想忽略由此库引起的所有异常,无论其原因如何:在最坏的情况下,应用程序用户将看不到广告 - 它比应用程序崩溃要好得多。
由于库本身创建了后台线程 - 我不能通过try / catch包装它们。
问题
有没有办法捕获所有非处理后台(非主要)线程异常,只是为了在这种情况下终止线程,并防止应用程序崩溃?
相关问题
我看到了很多问题,但是其中一些问题太具体了(并没有涵盖我的情况),其他问题则指的是当开发人员控制线程创建并且能够使用try /包装整个线程时抓住。如果我仍然错过相关问题,涵盖此案例,我将非常感谢链接
答案 0 :(得分:15)
您需要做的就是使用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());
}
});
}
}
答案 1 :(得分:3)
如上所述,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());