android - tutorial - io fabric apikey
Crashlytics Android SDK-UncaughtExceptionHandler personalizado (4)
Dado que las versiones recientes de Crashlytics realizan la inicialización de forma asíncrona, es mejor usar la devolución de llamada de inicialización de Fabric:
CrashlyticsCore core = new CrashlyticsCore.Builder()
.disabled(BuildConfig.DEBUG)
.build();
Fabric.with(new Fabric.Builder(this).kits(new Crashlytics.Builder()
.core(core)
.build())
.initializationCallback(new InitializationCallback<Fabric>() {
@Override
public void success(Fabric fabric) {
mDefaultUEH = Thread.getDefaultUncaughtExceptionHandler();
Thread.setDefaultUncaughtExceptionHandler(mCaughtExceptionHandler);
}
@Override
public void failure(Exception e) {
}
})
.build());
¿Es posible incorporar UncaughtExceptionHandler personalizado junto con crashlytics en una aplicación? Si es así, ¿cómo?
Ninguna si esas soluciones funcionaron para mí. Lo hice como siguiendo:
// Setup handler for uncaught exceptions.
Thread.setDefaultUncaughtExceptionHandler (new Thread.UncaughtExceptionHandler()
{
@Override
public void uncaughtException (Thread thread, Throwable e)
{
//Send Report to Crashlytics. Crashlytics will send it as soon as it starts to work
Crashlytics.logException(e);
//Your custom codes to Restart the app or handle this crash
HandleCrashes(thread, e);
}
});
Y aquí está mi método personalizado para reiniciar la aplicación:
private void HandleCrashes(Thread t, Throwable e) {
Intent i = new Intent(mContext, frmLogin.class);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i.putExtra("JustLogin", true);
startActivity(i);
System.exit(1);
}
Sí, es posible.
En su clase de aplicación:
@Override
public void onCreate() {
super.onCreate();
Crashlytics.start(this);
initUncaughtExceptionHandler();
}
private void initUncaughtExceptionHandler() {
final ScheduledThreadPoolExecutor c = new ScheduledThreadPoolExecutor(1);
c.schedule(new Runnable() {
@Override
public void run() {
final UncaughtExceptionHandler defaultHandler = Thread.getDefaultUncaughtExceptionHandler();
Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread paramThread, Throwable paramThrowable) {
// do my amazing stuff here
System.err.println("Error!");
//then pass the job to the previous handler
defaultHandler.uncaughtException(paramThread, paramThrowable);
}
});
}
}, 5, TimeUnit.SECONDS);
}
La razón por la que programo esto después de 5 segundos es porque Crashlytics necesita algo de tiempo para configurar sus cosas. Estoy usando este código y funciona perfectamente. Por supuesto, si su aplicación falla al inicio, lo siento pero no hay un controlador personalizado;)
ACTUALIZAR
Por favor vea la answer @kmityak ya que la inicialización de Crashlytics / Fabric ahora es asíncrona y mi solución a continuación ya no es válida.
RESPUESTA ORIGINAL
Puede configurar su UncaughtExceptionHandler personalizado siempre que pase una excepción al UncaughtExceptionHandler predeterminado que se manejará más adelante a través de Crashlytics.
El código siguiente se implementa dentro de la subclase de aplicación:
private static Thread.UncaughtExceptionHandler mDefaultUEH;
private static Thread.UncaughtExceptionHandler mCaughtExceptionHandler = new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread thread, Throwable ex) {
// Custom logic goes here
// This will make Crashlytics do its job
mDefaultUEH.uncaughtException(thread, ex);
}
};
@Override
public void onCreate() {
super.onCreate();
// Order is important!
// First, start Crashlytics
Crashlytics.start(this);
// Second, set custom UncaughtExceptionHandler
mDefaultUEH = Thread.getDefaultUncaughtExceptionHandler();
Thread.setDefaultUncaughtExceptionHandler(mCaughtExceptionHandler);
}
La segunda opción es registrar Crashlytics después de configurar su UncaughtExceptionHandler personalizado. A continuación, Crashlytics informará todas las excepciones no detectadas como fatales, y luego pasará a su controlador personalizado.