Intereting Posts
Принудительный режим погружения отключен после показа мягкой клавиатуры Поиск Android SDK на Mac и добавление в PATH Как заблокировать ориентацию фрагмента без фиксации ориентации активности? Прозрачная деятельность открывается по основной деятельности. Как открыть его не по основной деятельности? Дублирующий класс, найденный при одинаковом имени класса под тестом и androidTest Bitmap.Config.HARDWARE vs Bitmap.Config.RGB_565 Android EditText Hint Лучший кросс-платформенный инструмент разработки для iPhone и Android Android RatingBar показывает черный наложение на некоторых устройствах Единый идентификатор рекламного блока Admob для разных приложений? Поворот байтового массива JPEG после onPictureTaken Применить цветной фильтр с помощью xml в ImageView Как вставлять и воспроизводить видео на YouTube в андроиде Как захватить изображение из пользовательского CameraView в Android? Android-калькулятор для BMS для WMS getFeatureInfo

Android зависает, когда в OnClickListener.onClick есть исключение NullPointerException (другие задачи не могут запускаться)

У меня простая настройка:

  • CrashHandler – класс, который реализует Thread.UncaughtExceptionHandler ;
  • CrashActivity – активность, которая может отправлять отчеты пользователей;
  • MainActivity – основное приложение, с которым пользователь должен взаимодействовать.

Когда в MainActivity или любом из его потоков есть CrashHandler , CrashHandler перехватывает его и создает уведомление с намерением запустить CrashActivity :

 Intent it = new Intent("CrashReporter" + SystemClock.currentThreadTimeMillis()); it.setClass(context, CrashActivity.class); it.setFlags(it.getFlags() | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); 

В то же время, когда Android показывает сообщение об ошибке «Приложение», пользователь нажимает «ОК», приложение закрывается, а затем пользователь может щелкнуть notification . Если щелкнуть notification , начнется и показывается CrashActivity .

Этот код работает долгое время во многих ситуациях (авария на основном потоке, авария в handler , авария на фоновом thread …). Однако недавно я обнаружил, что он НЕ РАБОТАЕТ, если исключение OnClickListener.onClick методе OnClickListener.onClick в прослушивателе, прикрепленном к button в MainActivity . Ситуация такова:

  1. Я выполняю код, который преднамеренно вызывает NullPointerException ;
  2. CrashHandler перехватывает его и создает notification (которое показано);
  3. Android НЕ показывает никаких сообщений (например, нет «Application crashed», который должен быть видимым);
  4. MainActivity заморожен;
  5. Если пользователь нажимает на уведомление для запуска CrashActivity , отображается черный экран и все зависает (желаемая активность не отображается).

Logcat показывает, что есть время ожидания при запуске, даже до OnCreate или любого из моего кода:

 I/ActivityManager(11826): START u0 {act=CrashHandler1196 flg=0x14000000 cmp=mycompany.myapp/.CrashActivity bnds=[0,102][720,230] (has extras)} from pid -1 W/KeyguardViewMediator(11826): verifyUnlock called when not externally disabled W/ActivityManager(11826): Activity pause timeout for ActivityRecord{41f4d988 u0 mycompany.myapp/.MainActivity} W/ActivityManager(11826): Launch timeout has expired, giving up wake lock! W/ActivityManager(11826): Activity idle timeout for ActivityRecord{4225eeb8 u0 mycompany.myapp/.CrashActivity} 
  • Если перед нажатием на notification я убью приложение из ADB , notification работает отлично.
  • Если перед нажатием на notification я сделаю несколько кликов и жестов в замороженном приложении, через несколько секунд я получаю сообщение об ANR :

      E/ActivityManager(11826): ANR in mycompany.myapp (mycompany.myapp/.MainActivity) E/ActivityManager(11826): Reason: keyDispatchingTimedOut E/ActivityManager(11826): Load: 0.63 / 0.57 / 0.49 
  • Если я нажму «да, убей его», а затем нажмите notification , он отлично работает.

  • Если я добавлю System.exit (-1) в CrashHandler сразу после создания уведомления, приложение сразу же прекратит работу, и уведомление будет работать отлично (к сожалению, я не могу пойти с этим решением в процессе производства).

У меня есть два вопроса:

  1. Почему NullPointer exception в OnClickListener.onClick не приводит к сбою приложения, вместо этого замораживает его вместе с ОС и предотвращает запуск других действий?
  2. Что делать, чтобы избежать этого вообще или, по крайней мере, как сделать CrashActivity стартом в этих условиях?

Solutions Collecting From Web of "Android зависает, когда в OnClickListener.onClick есть исключение NullPointerException (другие задачи не могут запускаться)"

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

 void uncaughtException(Thread t, Throwable e) 

«Любое исключение, вызванное этим методом, будет игнорироваться виртуальной машиной Java». (JavaDoc).

Я не говорю, что это ответ, но это может быть ответ, если этот метод исключает.

Почему вы не можете убить свой собственный процесс приложения с помощью https://developer.android.com/reference/android/os/Process.html#sendSignal(int , int)?