自做聪明把Activity的AssetManager给close()掉的结果

前几天写了一个Activity+View的软件开头动画效果,因为觉得以后可能还会用到,于是就给这个Activity(LogoActivity)给写了一个abstract方法showMain()以便以后继承LogoActivity实现showMain()使用。

在修改的过程中因为使用到了InputStream,但没有将它关闭,所以就在finally中吧InputStream给close()了 。突然看到前面也用到了AssetManager assetMgr=AssetManager assetMgr = this.getAssets();于是就顺手把assetMgr也close()掉了。

代码片段:

1 try {
2 strs = assetMgr.list("bgimgs");
3 bgimgs = new Bitmap[strs.length];
4 for(int i=0;i<strs.length;i++){
5 is = assetMgr.open("bgimgs/" + strs[i]);
6 datas = new byte[is.available()];
7 is.read(datas);
8 bgimgs[i] = BitmapFactory.decodeByteArray(datas, 0, datas.length);
9 }
10
11 } catch (IOException e) {
12 e.printStackTrace();
13 }finally{
14 try{
15 is.close();
16 }catch(IOException e){
17 e.printStackTrace();
18 }
19 assetMgr.close();
20 }

本来以为都是写过的代码没什么问题就没有再调试,最后写好了一个子类继承LogoActivity,实现了showMain(),但是问题出现了,程序直接挂掉。

错误提示如下:

错误提示
1 06-25 03:18:13.464: WARN/dalvikvm(1035): threadid=1: thread exiting with uncaught exception (group=0x4001d800)
2  06-25 03:18:13.494: ERROR/AndroidRuntime(1035): FATAL EXCEPTION: main
3  06-25 03:18:13.494: ERROR/AndroidRuntime(1035): java.lang.RuntimeException: Unable to start activity ComponentInfo{breakan.util/breakan.test.BreakanActivity}: android.content.res.Resources$NotFoundException: File res/layout/screen_title.xml from xml type layout resource ID #0x1090058
4  06-25 03:18:13.494: ERROR/AndroidRuntime(1035): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
5  06-25 03:18:13.494: ERROR/AndroidRuntime(1035): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
6 06-25 03:18:13.494: ERROR/AndroidRuntime(1035): at android.app.ActivityThread.access$2300(ActivityThread.java:125)
7 06-25 03:18:13.494: ERROR/AndroidRuntime(1035): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
8 06-25 03:18:13.494: ERROR/AndroidRuntime(1035): at android.os.Handler.dispatchMessage(Handler.java:99)
9 06-25 03:18:13.494: ERROR/AndroidRuntime(1035): at android.os.Looper.loop(Looper.java:123)
10 06-25 03:18:13.494: ERROR/AndroidRuntime(1035): at android.app.ActivityThread.main(ActivityThread.java:4627)
11 06-25 03:18:13.494: ERROR/AndroidRuntime(1035): at java.lang.reflect.Method.invokeNative(Native Method)
12 06-25 03:18:13.494: ERROR/AndroidRuntime(1035): at java.lang.reflect.Method.invoke(Method.java:521)
13 06-25 03:18:13.494: ERROR/AndroidRuntime(1035): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
14 06-25 03:18:13.494: ERROR/AndroidRuntime(1035): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
15 06-25 03:18:13.494: ERROR/AndroidRuntime(1035): at dalvik.system.NativeStart.main(Native Method)
16 06-25 03:18:13.494: ERROR/AndroidRuntime(1035): Caused by: android.content.res.Resources$NotFoundException: File res/layout/screen_title.xml from xml type layout resource ID #0x1090058
17 06-25 03:18:13.494: ERROR/AndroidRuntime(1035): at android.content.res.Resources.loadXmlResourceParser(Resources.java:1916)
18 06-25 03:18:13.494: ERROR/AndroidRuntime(1035): at android.content.res.Resources.loadXmlResourceParser(Resources.java:1871)
19 06-25 03:18:13.494: ERROR/AndroidRuntime(1035): at android.content.res.Resources.getLayout(Resources.java:731)
20 06-25 03:18:13.494: ERROR/AndroidRuntime(1035): at android.view.LayoutInflater.inflate(LayoutInflater.java:318)
21 06-25 03:18:13.494: ERROR/AndroidRuntime(1035): at android.view.LayoutInflater.inflate(LayoutInflater.java:276)
22 06-25 03:18:13.494: ERROR/AndroidRuntime(1035): at com.android.internal.policy.impl.PhoneWindow.generateLayout(PhoneWindow.java:2165)
23 06-25 03:18:13.494: ERROR/AndroidRuntime(1035): at com.android.internal.policy.impl.PhoneWindow.installDecor(PhoneWindow.java:2220)
24 06-25 03:18:13.494: ERROR/AndroidRuntime(1035): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:213)
25 06-25 03:18:13.494: ERROR/AndroidRuntime(1035): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:207)
26 06-25 03:18:13.494: ERROR/AndroidRuntime(1035): at android.app.Activity.setContentView(Activity.java:1658)
27 06-25 03:18:13.494: ERROR/AndroidRuntime(1035): at breakan.util.LogoActivity.showLogo(LogoActivity.java:61)
28 06-25 03:18:13.494: ERROR/AndroidRuntime(1035): at breakan.util.LogoActivity.onCreate(LogoActivity.java:27)
29 06-25 03:18:13.494: ERROR/AndroidRuntime(1035): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
30 06-25 03:18:13.494: ERROR/AndroidRuntime(1035): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
31 06-25 03:18:13.494: ERROR/AndroidRuntime(1035): ... 11 more
32 06-25 03:18:13.494: ERROR/AndroidRuntime(1035): Caused by: java.lang.RuntimeException: Assetmanager has been closed
33 06-25 03:18:13.494: ERROR/AndroidRuntime(1035): at android.content.res.AssetManager.openXmlBlockAsset(AssetManager.java:483)
34 06-25 03:18:13.494: ERROR/AndroidRuntime(1035): at android.content.res.Resources.loadXmlResourceParser(Resources.java:1898)
35 06-25 03:18:13.494: ERROR/AndroidRuntime(1035): ... 24 more
36 06-25 03:18:13.514: WARN/ActivityManager(59): Force finishing activity breakan.util/breakan.test.BreakanActivity
37 06-25 03:18:14.024: WARN/ActivityManager(59): Activity pause timeout for HistoryRecord{4504b648 breakan.util/breakan.test.BreakanActivity}
38 06-25 03:18:15.514: INFO/Process(1035): Sending signal. PID: 1035 SIG: 9
39 06-25 03:18:15.554: WARN/InputManagerService(59): Window already focused, ignoring focus gain of: com.android.internal.view.IInputMethodClient$Stub$Proxy@44f62c80
40 06-25 03:18:15.944: INFO/ActivityManager(59): Process breakan.util (pid 1035) has died.
41 06-25 03:18:24.075: WARN/ActivityManager(59): Activity destroy timeout for HistoryRecord{4504b648 breakan.util/breakan.test.BreakanActivity}

结果我调试了好久才发现,就是因为我把Activity的AssetManager给close()掉了才产生的错误。

看来以后关闭一个对象要先看清楚是不是自己生成的对象,会不会被隐式调用。

posted on 2011-06-25 11:42  breakan  阅读(3720)  评论(0编辑  收藏  举报

导航