1. finalize time out crash fix

Fatal Exception: java.util.concurrent.TimeoutException
android.content.res.AssetManager$AssetInputStream.finalize() timed out after 10 seconds
android.content.res.AssetManager$AssetInputStream.close

该异常是由于finalize方法超时导致,可以自定义一个类来复现该场景:

public class FinalizeTimeoutView extends View {

    private final String TAG = "FinalizeTimeoutView";

    public FinalizeTimeoutView(Context context) {
        super(context);
    }

    @Override
    protected void finalize() throws Throwable {
        Log.e(TAG, "finalize-begin");
        Thread.sleep(1000 * 20);
        super.finalize();
        Log.e(TAG, "finalize-end");
    }
}

在一个Activity中,重复多次创建FinalizeTimeoutView,然后退出,在过20s过后,该问题就复现出来了。

解决方法是在出现 TimeoutException 时主动忽略这个异常,阻断 UncaughtExceptionHandler 链式调用,使系统默认的 UncaughtExceptionHandler 不会被调用,APP 就不会停止运行而继续存活下去。由于这个过程用户无感知,对用户无明显影响,可以最大限度的减少对用户的影响。

    val oldHandler = Thread.getDefaultUncaughtExceptionHandler()
    Thread.setDefaultUncaughtExceptionHandler { t, e ->
        if (t.name == "FinalizerWatchdogDaemon" && e is TimeoutException) {
            Log.e(TAG, "ignore it")
        } else {
            oldHandler.uncaughtException(t, e)
        }
    }

参考链接1

参考链接2_解决方法

results matching ""

    No results matching ""