Android se congela cuando hay una NullPointerException en OnClickListener.onClick (otras tareas no se pueden iniciar)

Tengo una configuración sencilla:

  • CrashHandler – una clase que implementa Thread.UncaughtExceptionHandler ;
  • CrashActivity – una actividad que puede enviar informes de usuario;
  • MainActivity – la aplicación principal con la que el usuario debe interactuar.

Cuando hay una excepción no MainActivity dentro de MainActivity o cualquiera de sus subprocesos, el CrashHandler intercepta y crea una notificación con la intención de iniciar 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); 

Mientras tanto, Android muestra un mensaje "Aplicación se estrelló", el usuario hace clic en Aceptar, la aplicación se cierra y, a continuación, el usuario puede hacer clic en la notification . Si se hace clic en la notification , CrashActivity inicia y se muestra.

Este código ha estado trabajando durante mucho tiempo en muchas situaciones diferentes (accidente en el hilo principal, accidente en un handler , accidente en un thread fondo …). Sin embargo, recientemente descubrí que no funciona si la excepción se produce en el método OnClickListener.onClick en un oyente conectado a un button en MainActivity . La situación es la siguiente:

  1. Ejecuto código que deliberadamente lanza una NullPointerException ;
  2. CrashHandler intercepta y crea una notification (que se muestra);
  3. Android NO muestra ningún mensaje (por ejemplo, no hay "Aplicación bloqueada", que debería ser visible);
  4. La actividad MainActivity está congelada;
  5. SI el usuario hace clic en la notificación para iniciar el CrashActivity , se muestra una pantalla en negro y todo se congela (no se muestra la actividad deseada).

Logcat muestra que hay un tiempo de espera en el inicio, incluso antes de OnCreate o cualquiera de mi código:

 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} 
  • Si antes de hacer clic en la notification , mato la aplicación de ADB , la notification funciona perfectamente.
  • Si antes de hacer clic en la notification hago algunos clics y gestos en la aplicación congelada, después de unos segundos recibo un mensaje sobre una 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 
  • Si hago clic en "yes, kill it" y, a continuación, haga clic en la notification , funciona perfectamente.

  • Si añado System.exit (-1) en el CrashHandler justo después de crear la notificación, la aplicación se cierra inmediatamente y la notificación funciona perfectamente (por desgracia, no puedo ir con esta solución en producción).

Tengo dos preguntas:

  1. ¿Por qué una NullPointer exception en OnClickListener.onClick no provoca que la aplicación se bloquee, en lugar de congelarla junto con el sistema operativo e impedir que otras actividades se inicien?
  2. ¿Qué hacer para evitarlo en general, o al menos, cómo hacer que CrashActivity empiece en estas condiciones?

2 Solutions collect form web for “Android se congela cuando hay una NullPointerException en OnClickListener.onClick (otras tareas no se pueden iniciar)”

Sin ver su código, debe depurar CrashHandler Clase. La JVM ignorará todas las excepciones en este

 void uncaughtException(Thread t, Throwable e) 

"Cualquier excepción lanzada por este método será ignorada por la máquina virtual de Java." (JavaDoc).

No digo que esta es la respuesta, pero es posible que la respuesta, si este método thwows una excepción.

¿Por qué no puedes matar tu propio proceso de aplicación con https://developer.android.com/reference/android/os/Process.html#sendSignal(int , int)?

  • Cómo configurar onclick listener para un botón en un fragmento en android
  • Android: Evento de clic de botón
  • Interceptación de clics desde subview en Android
  • Android: ¿Cómo vas a otra actividad al hacer clic?
  • distinguir un golpe y hacer clic en android (pasar el evento a otra vista si es un golpe)
  • ¿Cómo escribir el método onClick en el viewpager?
  • Android Detener la notificación de brindis por programación?
  • Cómo dejar OnClick en la función de la llamada de adaptador ListView de la actividad
  • ¿Cómo exactamente el atributo android: onClick XML difiere de setOnClickListener?
  • Android, ¿Cómo puedo obtener texto de TextView en OnClick
  • Evite que EditText consuma un evento de clic
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.