Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Crashlytics Android SDK-自定义UncaughtExceptionHandler_Android_Crashlytics - Fatal编程技术网

Crashlytics Android SDK-自定义UncaughtExceptionHandler

Crashlytics Android SDK-自定义UncaughtExceptionHandler,android,crashlytics,Android,Crashlytics,是否可以将自定义UncaughtExceptionHandler与crashlytics合并到一个应用程序中?如果是-如何更新 请参阅@kmityak,因为Crashlytics/Fabric初始化现在是异步的,我下面的解决方案不再有效 原始答案 您可以设置自定义UncaughtExceptionHandler,前提是它将异常传递给默认UncaughtExceptionHandler,以便稍后通过Crashlytics进行处理 以下代码在应用程序子类中实现: 第二个选项是在设置自定义Uncau

是否可以将自定义UncaughtExceptionHandler与crashlytics合并到一个应用程序中?如果是-如何更新

请参阅@kmityak,因为Crashlytics/Fabric初始化现在是异步的,我下面的解决方案不再有效

原始答案

您可以设置自定义UncaughtExceptionHandler,前提是它将异常传递给默认UncaughtExceptionHandler,以便稍后通过Crashlytics进行处理

以下代码在应用程序子类中实现:


第二个选项是在设置自定义UncaughtExceptionHandler后注册Crashlytics,然后Crashlytics将所有未捕获的异常报告为fatals,并在这之后传递给自定义处理程序。

更新

请参阅@kmityak,因为Crashlytics/Fabric初始化现在是异步的,我下面的解决方案不再有效

原始答案

您可以设置自定义UncaughtExceptionHandler,前提是它将异常传递给默认UncaughtExceptionHandler,以便稍后通过Crashlytics进行处理

以下代码在应用程序子类中实现:

第二个选项是在设置自定义UncaughtExceptionHandler后注册Crashlytics,然后Crashlytics会将所有未捕获的异常报告为fatals,然后将其传递给自定义处理程序。

是的,这是可能的

在应用程序类中:

@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);
}
我之所以在5秒后安排这个是因为Crashlytics需要一些时间来设置他的东西。我正在使用这个代码,它工作得非常好。当然,如果您的应用程序在启动时崩溃,很抱歉,但没有自定义处理程序;)

是的,这是可能的

在应用程序类中:

@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);
}

我之所以在5秒后安排这个是因为Crashlytics需要一些时间来设置他的东西。我正在使用这个代码,它工作得非常好。当然,如果您的应用程序在启动时崩溃,很抱歉,但没有自定义处理程序;)

如果这些解决方案对我有效,就没有了。我是这样做的:

// 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);
    }
});
下面是我重启应用程序的自定义方法:

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);
}

如果这些解决方案对我有效,那就没有了。我是这样做的:

// 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);
    }
});
下面是我重启应用程序的自定义方法:

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);
}

由于Crashlytics的最新版本以异步方式执行初始化,因此最好使用Fabric的初始化回调:

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);
    }
};

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());
private static Thread.UncaughtExceptionHandler mDefaultUEH;
私有静态线程.UncaughtExceptionHandler mCaughtExceptionHandler=
新线程。UncaughtExceptionHandler(){
@凌驾
public void uncaughtException(线程,可丢弃的ex){
//这里是自定义逻辑
//这将使Crashlytics完成它的工作
mDefaultUEH.uncaughtException(线程,ex);
}
};
crashlyticcore=new crashlyticcore.Builder()
.disabled(BuildConfig.DEBUG)
.build();
with(新的Fabric.Builder(this.kits)(新的Crashlytics.Builder())
.核心(核心)
.build())
.initializationCallback(新的initializationCallback(){
@凌驾
公共空间成功(织物){
mDefaultUEH=Thread.getDefaultUncaughtExceptionHandler();
setDefaultUncaughtExceptionHandler(mCaughtExceptionHandler);
}
@凌驾
公共失效(例外e){
}
})
.build());

由于Crashlytics的最新版本异步执行初始化,因此最好使用Fabric的初始化回调:

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);
    }
};

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());
private static Thread.UncaughtExceptionHandler mDefaultUEH;
私有静态线程.UncaughtExceptionHandler mCaughtExceptionHandler=
新线程。UncaughtExceptionHandler(){
@凌驾
public void uncaughtException(线程,可丢弃的ex){
//这里是自定义逻辑
//这将使Crashlytics完成它的工作
mDefaultUEH.uncaughtException(线程,ex);
}
};
crashlyticcore=new crashlyticcore.Builder()
.disabled(BuildConfig.DEBUG)
.build();
with(新的Fabric.Builder(this.kits)(新的Crashlytics.Builder())
.核心(核心)
.build())
.initializationCallback(新的initializationCallback(){
@凌驾
公共空间成功(织物){
mDefaultUEH=Thread.getDefaultUncaughtExceptionHandler();
setDefaultUncaughtExceptionHandler(mCaughtExceptionHandler);
}
@凌驾
公共失效(例外e){
}
})
.build());

我找到了Fabric 2.10.1的解决方案:

Thread.setDefaultUncaughtExceptionHandler(yourExceptionHandler)
Fabric.with(this, Crashlytics())

我找到了Fabric 2.10.1的解决方案:

Thread.setDefaultUncaughtExceptionHandler(yourExceptionHandler)
Fabric.with(this, Crashlytics())
  • 关闭自动收集

    将此添加到您的
    AndroidManifest.xml

  • 在注册UncaughtExceptionHandler后手动启动Crashlytics
  • 重新生成并重新安装应用程序
  • 关闭自动收集

    将此添加到您的
    AndroidManifest.xml

  • 在注册UncaughtExceptionHandler后手动启动Crashlytics
  • 重新生成并重新安装应用程序

  • 这个运气好吗?我在NewRelic上也遇到了同样的问题。发现代码无法进一步链接未捕获的异常。@SephRemotigue尝试此解决方案此解决方案成功吗?我在NewRelic上也遇到了同样的问题。发现代码无法进一步链接未捕获的异常。@SephRemotigue尝试此解决方案此解决方案的问题是Crashlytics会将此崩溃报告为非致命性而非一般性崩溃。@VitoValov有办法解决此问题吗?仍然发送为致命崩溃并重新启动应用程序?此解决方案的问题是Crashlytics将此崩溃报告为非致命崩溃,而不是g