Android全局处理收集异常,在Android上使用全局异常处理

这篇博客探讨了在Android应用中如何设置自定义异常处理程序以在异常发生时记录日志,同时避免因每次实例化活动时处理程序链增长导致的内存泄漏问题。作者提出了一种解决方案,即在`onCreate()`方法中检查自定义处理程序是否已附加,并确保只附加一次,从而解决无限增长的处理程序链和潜在的内存不足问题。
摘要由CSDN通过智能技术生成

我只想指出到目前为止的经验。我正在使用https://stackoverflow.com/a/26560727/2737240建议的解决方案,以在将控制权交给默认异常处理程序之前将异常刷新到我的日志文件中。

但是,我的结构如下所示:

BaseActivity

|

_______________________

|          |          |

Activity A Activity B Activity C

final Thread.UncaughtExceptionHandler defaultEH = Thread.getDefaultUncaughtExceptionHandler();

Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {

@Override

public void uncaughtException(Thread thread, Throwable e) {

handleUncaughtException(thread, e, defaultEH);

}

});

在其中handleUncaughtException(thread, e, defaultEH);写入日志并将调用移交给原始的UncaughtExceptionHandler。

因此,使用此代码会发生以下情况:

活动A被实例化

现在,新的默认异常处理程序(DEH)是我的日志处理程序+旧的DEH

活动B被实例化

现在,新DEH是我的日志处理程序+旧DEH(日志处理程序+原始DEH)

活动C被实例化

现在,新的DEH是我的日志处理程序+旧的DEH(日志处理程序+日志处理程序+原始DEH)

因此,这条链无限增长,从而导致两个问题:

指定的自定义代码(在我的情况下,将其写入日志文件)将被多次调用,这不是所需的操作。

即使活动完成后,defaultEh的引用也保留在堆中,因为引用链使用了它,因此可能发生的最坏的情况是内存不足异常。

因此,我又添加了一点东西来最终使这项工作毫无问题:

private static boolean customExceptionHandlerAttached = false;

@Override

protected void onCreate(@Nullable Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

if(!customExceptionHandlerAttached) {

final Thread.UncaughtExceptionHandler defaultEH = Thread.getDefaultUncaughtExceptionHandler();

Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {

@Override

public void uncaughtException(Thread thread, Throwable e) {

handleUncaughtException(thread, e, defaultEH);

}

});

customExceptionHandlerAttached = true;

}

}

使用此解决方案,我们可以确保:

为我们所需的操作添加自定义异常处理程序

确保此操作仅触发一次

允许垃圾回收器通过调用finish()完全处置我们的活动

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>