Assetmanager关闭后(action_menu_layout.xml)NotFoundException

2016年03月24日 Android 暂无评论 阅读3346次

Assetmanager关闭后(action_menu_layout.xml)NotFoundException

在论坛上看到有人问到一个json如何去解析,我便在自己IDE上新建了一个简单的json工程,并且把提问者的json源作为txt文件放到了asset下,便于我去读取。

因为是测试工程,所以直接在MainActivity#onCreate()中,就直接去开始打开asset下的文件然后再去解析了。

有这样一个方法是从asset下读取文件的。

private String getJsonStrFromAsset(String path) {
    AssetManager am = null;
    InputStream is = null;
    InputStreamReader isr = null;
    BufferedReader br = null;
    String jsonStr = "";
    try {
        am = getAssets();
        is = am.open(path);
        isr = new InputStreamReader(is);
        br = new BufferedReader(isr);
        String line = "";
        while ((line = br.readLine()) != null) {
            jsonStr += line;
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (br != null) {
            try {
                br.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        if (isr != null) {
            try {
                isr.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        if (is != null) {
            try {
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        if (am != null) {
            am.close();
        }
    }
    return jsonStr;
} 

另外还有一段代码是如何去解析这个jsonString的,因为和本文无关所以就不贴出来了。

(action_menu_layout.xml)NotFoundException异常日志

程序运行后,出现了crash。得到的日志如下

I/Process(15158): Sending signal. PID: 15158 SIG: 9
E/Trace(16282): error opening trace file: No such file or directory (2)
D/libEGL(16282): loaded /system/lib/egl/libEGL_mali.so
D/libEGL(16282): loaded /system/lib/egl/libGLESv1_CM_mali.so
D/libEGL(16282): loaded /system/lib/egl/libGLESv2_mali.so
D/(16282): Device driver API match
D/(16282): Device driver API version: 10
D/(16282): User space API version: 10 
D/(16282): mali: REVISION=Linux-r2p4-02rel0 BUILD_DATE=Fri Sep 28 10:42:56 KST 2012 
D/OpenGLRenderer(16282): Enabling debug mode 0
D/AndroidRuntime(16282): Shutting down VM
W/dalvikvm(16282): threadid=1: thread exiting with uncaught exception (group=0x416742a0)
E/AndroidRuntime(16282): FATAL EXCEPTION: main
E/AndroidRuntime(16282): android.content.res.Resources$NotFoundException: File res/layout/    action_menu_layout.xml from xml type layout resource ID #0x109001b
E/AndroidRuntime(16282):    at android.content.res.Resources.loadXmlResourceParser(Resources.java:2178)
E/AndroidRuntime(16282):    at android.content.res.Resources.loadXmlResourceParser(Resources.java:2133)
E/AndroidRuntime(16282):    at android.content.res.Resources.getLayout(Resources.java:865)
E/AndroidRuntime(16282):    at android.view.LayoutInflater.inflate(LayoutInflater.java:394)
E/AndroidRuntime(16282):    at com.android.internal.view.menu.BaseMenuPresenter.getMenuView(    BaseMenuPresenter.java:74)
E/AndroidRuntime(16282):    at com.android.internal.view.menu.ActionMenuPresenter.getMenuView(    ActionMenuPresenter.java:222)
E/AndroidRuntime(16282):    at com.android.internal.widget.ActionBarView.setMenu(ActionBarView.java:469)
E/AndroidRuntime(16282):    at com.android.internal.policy.impl.PhoneWindow.preparePanel(PhoneWindow.    java:435)
E/AndroidRuntime(16282):    at com.android.internal.policy.impl.PhoneWindow.invalidatePanelMenu(    PhoneWindow.java:813)
E/AndroidRuntime(16282):    at com.android.internal.policy.impl.PhoneWindow$1.run(PhoneWindow.java:3128)
E/AndroidRuntime(16282):    at android.os.Handler.handleCallback(Handler.java:615)
E/AndroidRuntime(16282):    at android.os.Handler.dispatchMessage(Handler.java:92)
E/AndroidRuntime(16282):    at android.os.Looper.loop(Looper.java:137)
E/AndroidRuntime(16282):    at android.app.ActivityThread.main(ActivityThread.java:4898)
E/AndroidRuntime(16282):    at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(16282):    at java.lang.reflect.Method.invoke(Method.java:511)
E/AndroidRuntime(16282):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.    java:1006)
E/AndroidRuntime(16282):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773)
E/AndroidRuntime(16282):    at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime(16282): Caused by: java.lang.RuntimeException: Assetmanager has been closed
E/AndroidRuntime(16282):    at android.content.res.AssetManager.openXmlBlockAsset(AssetManager.java:485)
E/AndroidRuntime(16282):    at android.content.res.Resources.loadXmlResourceParser(Resources.java:2160)
E/AndroidRuntime(16282):    ... 18 more 

首先让我关注的是android.content.res.Resources$NotFoundException: File res/layout/action_menu_layout.xml from xml type layout resource ID #0x109001b 这个异常信息。

第一感觉是,eclipse创建Android工程时会自动加上个menu,但我确实没有用到menu。在工程中全局搜了一下,也没有发现哪有用到action_menu_layout.xml这个资源文件的地方。

接下来就是debug调试。在调试的过程中,发现从asset读取json源是正常的,解析json也是完全正常的。又陷入了思索中。

去StackOverflow上搜搜试试,竟然还真遇到了一样的问题。感谢TWiStErRob大神的回答。揭开了问题的关键点。

Always check the root cause, i.e. the last exception in the chain: Caused by: java.lang.RuntimeException: Assetmanager has been closed

You probably mess around with resources in the Java code, look around, or maybe something is wrong with the Activity lifecycle, anything "hacky" static?

就是这几句回答,让我把问题的关注点从action_menu_layout.xml资源文件转移到了Assetmanager has been closed上。

接着就把getJsonStrFromAsset()中,am.close()注释,结果crash现象消失了。

得到的启发是,一定要把异常日志全读一遍,找到其中的要害。还剩下的遗憾就是至今也不明白为什么am.close() 会影响到action_menu_layout.xml资源文件找不到的NotFoundException异常。

先记录到这里,我在继续看下AssetManager和Resources这两个类的源码,看看能否找到答案。

分享本文至:

WRITTEN BY

avatar
看了本文是不是觉得很赞,那就赶紧点击下面按钮分享给身边的朋友吧!

欢迎留言




用户登录

sitemap