AssetManager has been closed


AssetManager has been closed

我们在做IO操作时会非常在意IO流的关闭,就算发生异常,最后还是会使用 finally 关闭,遵循以下原则(即开即关?):

  • 使用完后必须关闭,哪怕异常都没关系,try-catch-finally一套走你

  • 先开后闭,最先创建和使用的对象(A对象)往往需要在最后时才关闭。原因是后面新开的对象(B对象)可能需要依赖 A

不过以上关闭原则对于 AssetManager 可能并不适用

  • AssetManager 只使用一次,例如只是在APP启动时读取某些配置。只此一次,然后关闭。遵循即开即关?的原则

  • AssetManager 反复使用,例如一个A Activity 需要读取Asset,完成任务后A Activity finish并AssetManager.close()。此时再次进入A Activity 需要读取Asset,报异常

java.lang.RuntimeException: AssetManager has been closed;

原因: 每一个APK文件在进程中都对应有一个全局的Resourses对象以及一个全局的AssetManager对象。其中,这个全局的Resourses对象保存在一个对应的ContextImpl对象的成员变量mResources中,而这个全局的AssetManager对象保存在这个全局的Resourses对象的成员变量mAssets中,简而言之AssetManager由系统创建,如果要反复使用的话,自己就不应该瞎逼关闭,否则会报 assetManager has been closed + xml文件找不到的奇怪错误


文章作者: PudgeLee
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 PudgeLee !
评论