在android中捕获线程中的所有异常

6rqinv9w  于 2021-07-09  发布在  Java
关注(0)|答案(2)|浏览(351)

我想捕捉由活动类中的任何语句引起的异常,以便防止崩溃。测试应用程序可能使用的所有可能场景是不可能的。我想给一个警报对话框或一个文本框内的应用程序按钮报告问题,但不希望应用程序崩溃。有什么办法吗?
我尝试使用构造函数在类级别抛出异常,但没有帮助。try-catch不能对每个语句都执行,所以有什么好的反崩溃解决方案可以捕获整个活动类中的异常呢?

kcwpcxri

kcwpcxri1#

是的,你可以这样做创建一个 ExceptionHandler 上课并收集车祸记录。。

public class ExceptionHandler implements
        Thread.UncaughtExceptionHandler {
    private final Activity myContext;
    private final String LINE_SEPARATOR = "\n";

    public ExceptionHandler(Activity context) {
        myContext = context;
    }

    public void uncaughtException(Thread thread, Throwable exception) {
        StringWriter stackTrace = new StringWriter();
        exception.printStackTrace(new PrintWriter(stackTrace));
        StringBuilder errorReport = new StringBuilder();
        errorReport.append("************CAUSE OF ERROR************\n\n");
        errorReport.append(stackTrace.toString());

        errorReport.append("\n************DEVICE INFORMATION***********\n");
        errorReport.append("Brand: ");
        errorReport.append(Build.BRAND);
        errorReport.append(LINE_SEPARATOR);
        errorReport.append("Device: ");
        errorReport.append(Build.DEVICE);
        errorReport.append(LINE_SEPARATOR);
        errorReport.append("Model: ");
        errorReport.append(Build.MODEL);
        errorReport.append(LINE_SEPARATOR);
        errorReport.append("Id: ");
        errorReport.append(Build.ID);
        errorReport.append(LINE_SEPARATOR);
        errorReport.append("Product: ");
        errorReport.append(Build.PRODUCT);
        errorReport.append(LINE_SEPARATOR);
        errorReport.append("\n************FIRMWARE************\n");
        errorReport.append("SDK: ");
        errorReport.append(Build.VERSION.SDK);
        errorReport.append(LINE_SEPARATOR);
        errorReport.append("Release: ");
        errorReport.append(Build.VERSION.RELEASE);
        errorReport.append(LINE_SEPARATOR);
        errorReport.append("Incremental: ");
        errorReport.append(Build.VERSION.INCREMENTAL);
        errorReport.append(LINE_SEPARATOR);

        Intent intent = new Intent(myContext, CrashActivity.class); //start a new activity to show error message
        intent.putExtra("error", errorReport.toString());
        myContext.startActivity(intent);

        android.os.Process.killProcess(android.os.Process.myPid());
        System.exit(10);
    }
}

现在,在mainactivity中,使用以下命令初始化exceptionhandler:

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    Thread.setDefaultUncaughtExceptionHandler(new ExceptionHandler(this));
    setContentView(R.layout.activity_main);
}
qlzsbp2j

qlzsbp2j2#

从主线程,例如oncreate()中

Thread thread = Thread.currentThread();
thread.setUncaughtExceptionHandler(uncaughtExceptionHandler);

相关问题