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文件找不到的奇怪错误