Реализовать обратный вызов, чтобы избежать принудительного закрытия при сообщении о сбое и отображении экрана поддержки - PullRequest
0 голосов
/ 05 ноября 2018

Вместо диалогового окна принудительного закрытия я хотел бы показать пользователю действие с информацией о поддержке и в то же время отправить информацию об ошибке в Bugsnag. Я следовал этому совету (https://trivedihardik.wordpress.com/2011/08/20/how-to-avoid-force-close-error-in-android/), чтобы настроить обработчик для неперехваченных исключений. Отчетность в bugsnag с bugsnag.notify, очевидно, занимает некоторое время, поэтому я подумал, что мне нужен AsyncTask, чтобы показать «Активность поддержки» и отправить уведомление Процесс должен быть убит только после того, как это было завершено. AFAIK, проблема с AsyncTask заключается в том, что он не способен обновлять поток пользовательского интерфейса при помещении в класс помощника. Так как я могу убедиться, что ошибка сообщается busgnag, активность поддержки отображается, а процесс прекращается?

Код в MainActivity.java

Bugsnag.init(this);
Thread.setDefaultUncaughtExceptionHandler(new ExceptionHandler(this));

ExceptionHandler.java

import android.app.Activity;
import android.content.Intent;
import android.os.AsyncTask;
import android.util.Log;
import com.bugsnag.android.Bugsnag;

public class ExceptionHandler implements java.lang.Thread.UncaughtExceptionHandler {
    private final Activity myContext;

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

    public void uncaughtException(Thread thread, Throwable exception) {
        new ReportCrashTask().execute();
    }

    private class ReportCrashTask extends AsyncTask<String, Void, String> {

        @Override
        protected String doInBackground(String... params) {
            Intent intent = new Intent(myContext, CrashActivity.class);
            myContext.startActivity(intent);

            Bugsnag.notify(new RuntimeException("Test error"));
            return "done";
        }

        @Override
        protected void onPostExecute(String aVoid) {
            super.onPostExecute(aVoid);
            android.os.Process.killProcess(android.os.Process.myPid());
            System.exit(10);
        }
    }
}
...