Как заставить ACRA остановить приложение, когда исключение не входит в основную деятельность? - PullRequest
0 голосов
/ 30 января 2019

Я хочу, чтобы мое приложение остановилось, когда ACRA обнаруживает и сообщает о необработанном исключении - нормальном поведении ACRA.Это не работает, когда исключение происходит в действии, которое не является основным.

После борьбы с этим в моем реальном приложении я создал очень простое приложение, которое использует ACRA, и позволяет мне вызывать исключение влибо основное действие, либо второе, которое можно начать с первого.Я тестирую с MinSDK, равным 26. Приложение на Java и имеет достаточно кода для генерации этого теста.

Исключение в первом действии приводит к желаемому результату (как определено в logcat и на экране):

  1. При нажатии кнопки основное действие генерирует исключение
  2. ACRA ловит исключение:
  3. ACRA запускает другой процесс приложения
  4. первый процесс заканчивается
  5. второй процесс выполняет обработку ACRA
  6. второй процесс завершается

Однако, работает снова, но с исключением во втором действии (с первым все еще включенстек задач), в результате:

  1. При нажатии кнопки основное действие запускает второе действие
  2. При нажатии кнопки второе действие генерирует исключение
  3. ACRA запускает другоепроцесс приложения
  4. Первый процесс завершается
  5. Процессы ACRA во втором процессе (также с использованием этой базы кода)
  6. , пока Android запускает еще третьПроцесс d - В этом проблема
  7. Второй процесс завершается
  8. Третий процесс отображает основной экран активности и ожидает

Чтопохоже, происходит то, что Android обнаруживает, что в стеке осталось действие, и запускает новый процесс для его продвижения вперед.

Но ACRA должна остановить это.

Это проблема ACRA?В любом случае, идеи о том, как это предотвратить?

* ПРИМЕЧАНИЕ:

  1. В своих тестах я использую сенсорные события на нижней панели навигации для генерации исключения деления на ноль.
  2. Насколько я могу судить, порядок завершения ACRA и запуска третьего процесса является неопределенным.Это также, вероятно, не имеет значения.
  3. Результаты теста получены при просмотре экрана и logcat.Важные события записываются с использованием класса Log .

Ниже приведен фрагмент основного действия, в котором показана обработка кнопок и генерация исключений.Второе действие похоже.

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        final Context context = this.getApplicationContext();
        setContentView(R.layout.activity_main);
        Log.i(MyApp.TAG, "MainActivity.onCreate() - pid:"+android.os.Process.myPid());
        mTextMessage = findViewById(R.id.message);
        BottomNavigationView navigation = findViewById(R.id.navigation);
        navigation.setOnNavigationItemSelectedListener((item) -> {
            switch (item.getItemId()) {
                case R.id.navigation_home:
                    int i = 0;
                    Log.i(MyApp.TAG, "Throwing exception in main activity");
                    Log.i(MyApp.TAG, "This shouldn't show up" + 3 / i);
                    return true;
                case R.id.navigation_dashboard:
                    Log.i(MyApp.TAG, "Starting Activity2");
                    startActivity(new Intent(context, Activity2.class));
                    return true;
                case R.id.navigation_notifications:
                    mTextMessage.setText(R.string.title_notifications);
                    return true;
            }
            return false;
        });

1 Ответ

0 голосов
/ 04 февраля 2019

Это ошибка в ACRA, исправленная этим PR , которая будет включена в следующий выпуск (5.3.0).

...