AssetManager$AssetInputStream.finalize() 10 秒后超时

Posted

技术标签:

【中文标题】AssetManager$AssetInputStream.finalize() 10 秒后超时【英文标题】:AssetManager$AssetInputStream.finalize() timed out after 10 seconds 【发布时间】:2015-02-07 12:55:40 【问题描述】:

我们在 android 4.3 Samsung Galaxy s3 上看到以下崩溃流

java.util.concurrent.TimeoutException: android.content.res.AssetManager$AssetInputStream.finalize() timed out after 10 seconds
       at android.content.res.AssetManager$AssetInputStream.close(AssetManager.java:559)
       at android.content.res.AssetManager$AssetInputStream.finalize(AssetManager.java:592)
       at java.lang.Daemons$FinalizerDaemon.doFinalize(Daemons.java:187)
       at java.lang.Daemons$FinalizerDaemon.run(Daemons.java:170)
       at java.lang.Thread.run(Thread.java:841)

帮助任何人?

【问题讨论】:

您是否偶然使用了 Crashlytics? @plinehan 我愿意。连接了吗? 这是我目前的理论。它在去年 3 月左右在 Crashlytics 更新后开始在我们的应用程序中发生,一些 Twitter 员工确认他们看到了类似的崩溃并最终恢复了 Crashlytics 版本。我已经更新到最新版本的 Crashlytics,我会看看它是否对这次崩溃有任何改进,但要过几周才能将它发布给公众。 我遇到了这样的崩溃,在检查手机类型后意识到这是黑莓手机,而不是真正的安卓手机。 有人找到任何解决方案吗?我在 SM-G900I,5.0 中也发现了问题 【参考方案1】:

每当您使用 StreamReader/StreamWriter 类进行读/写操作时,请确保您在第一个 try 块内调用 iostream.close()。像这样的:

    AssetManager AssetManager = mContext.getAssets();
    try 
        InputStream is = AssetManager.open("sample.json");
        int size = is.available();
        byte[] buffer = new byte[size];
        is.read(buffer);
        is.close();
     catch (Exception ex) 
        ex.printStackTrace();
    

即使你在catch/finally 块下还有另一个try 块,它仍然会抛出异常。

相反,您可以在 catch/finally 块中分配 ioStream = null

catch (Exception ex) 
  // If ioStream object is outside the try block
  ioStream = null;

【讨论】:

以上是关于AssetManager$AssetInputStream.finalize() 10 秒后超时的主要内容,如果未能解决你的问题,请参考以下文章

在没有上下文的情况下获取 AssetManager

c_cpp AssetManager.cpp

c_cpp AssetManager.cpp

assets raw 资源 AssetManager

一张图了解cc.assetManager.loadRemote过程

一张图了解cc.assetManager.loadRemote过程