Android UncaughtExceptionHandler для завершения приложения

Я хочу закрыть приложение после регистрации необработанного исключения. После поиска здесь я сделал следующее:

public class MyApplication extends Application {
    //uncaught exceptions
    private Thread.UncaughtExceptionHandler defaultUEH;

    // handler listener
    private Thread.UncaughtExceptionHandler _unCaughtExceptionHandler = new Thread.UncaughtExceptionHandler() {
        @Override
        public void uncaughtException(Thread thread, Throwable ex) {
            ActivityManager am = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
            //logging code
            //..........

            //call the default exception handler
            defaultUEH.uncaughtException(thread, ex);

        }
    };

    public MyApplication() {
        defaultUEH = Thread.getDefaultUncaughtExceptionHandler();
        Thread.setDefaultUncaughtExceptionHandler(_unCaughtExceptionHandler);
    }
}

После звонка defaultUEH.uncaughtException(thread, ex); я попытался позвонить System.exit(), а также android.os.Process.killProcess(android.os.Process.myPid()); (даже я нашел несколько сообщений, где сказано использовать оба). Проблема в том, что я получаю черный экран, и я должен принудительно закрыть приложение с помощью диспетчера задач телефона. Что я делаю не так?

С Уважением


person cobolero    schedule 11.08.2016    source источник
comment
зачем вам вызывать System.exit? Если вы хотите закрыть приложение, вы можете просто вызвать finsih(); по активности   -  person HendraWD    schedule 11.08.2016
comment
да, но проблема в том, что я ловлю исключения в объекте приложения, а не в действии   -  person cobolero    schedule 11.08.2016


Ответы (1)


Наконец я решил это, создав класс, реализующий интерфейс Thread.UncaughtExceptionHandler:

public class MyUncaughtExceptionHandler implements Thread.UncaughtExceptionHandler {

    private BaseActivity activity;
    private Thread.UncaughtExceptionHandler defaultUEH;

    public MyUncaughtExceptionHandler(BaseActivity activity) {
        this.activity = activity;
        this.defaultUEH = Thread.getDefaultUncaughtExceptionHandler();
    }

    public void setActivity(BaseActivity activity) {
        this.activity = activity;
    }

    @Override
    public void uncaughtException(Thread thread, Throwable ex) {

        //LOGGING CODE
        //........

        defaultUEH.uncaughtException(thread, ex);

    }
}

В BaseActivity я добавил следующий код:

//exception handling
private static MyUncaughtExceptionHandler _unCaughtExceptionHandler;

@Override
protected void onCreate(Bundle savedInstance) {
    super.onCreate(savedInstance);

    if(_unCaughtExceptionHandler == null)
        _unCaughtExceptionHandler = new MyUncaughtExceptionHandler(this);
    else
        _unCaughtExceptionHandler.setActivity(this);

    if(Thread.getDefaultUncaughtExceptionHandler() != _unCaughtExceptionHandler)
        Thread.setDefaultUncaughtExceptionHandler(_unCaughtExceptionHandler);
}

Я знаю, что это тот же код, что и в вопросе, но теперь он почему-то работает. Когда у меня будет больше свободного времени, я внимательно изучу это, чтобы найти основную причину и опубликовать ее.

person cobolero    schedule 12.08.2016