最近遇到一個 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
線程