最近遇到一个 Crashjava
java.util.concurrent.TimeoutException: android.content.res.AssetManager.finalize() timed out after 120 seconds
at android.content.res.AssetManager.destroy(Native Method)
at android.content.res.AssetManager.finalize(AssetManager.java:576)
at java.lang.Daemons$FinalizerDaemon.doFinalize(Daemons.java:217)
at java.lang.Daemons$FinalizerDaemon.run(Daemons.java:200)
at java.lang.Thread.run(Thread.java:818)
复制代码
乍一看没有任何业务相关的代码,不过数量还挺多,并且大多数是 OPPO 手机。android
看 Crash 堆栈,猜想应该是资源回收超时了,不过具体缘由还不清楚。从搜索引擎了解到,这个问题主要缘由有如下缘由:bash
根本的解决方案是:优化代码,资源及时释放,从根源上避免资源回收超时。多线程
不过因为代码量的问题,短时间内没法尝试该方案,那么只有退而求其次,寻求缓解方案。并发
从网上看到关于该问题的解决方案主要有如下两个:ide
直接说结论,这两种方法都是无效的,因此终极解决方案是优化
class ExceptionHandler : Thread.UncaughtExceptionHandler {
private val defaultExceptionHandler = Thread.getDefaultUncaughtExceptionHandler()
override fun uncaughtException(t: Thread?, e: Throwable?) {
if (t?.name == "FinalizerWatchdogDaemon" && e is TimeoutException) {
// ignore it
} else {
defaultExceptionHandler.uncaughtException(t, e)
}
}
}
复制代码
外部调用 Thread.setDefaultUncaughtExceptionHandler(ExceptionHandler())
替换异常处理器。搜索引擎
既然没法解决,那么就直接忽略它,避免对用户形成影响。spa
评论区有大牛提出了更完美的解决方案,你们能够尝试一下。感谢 @wfwf
线程