自做聪明把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(),但是问题出现了,程序直接挂掉。

错误提示如下:

ContractedBlock.gif ExpandedBlockStart.gif 错误提示
 
   
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()掉了才产生的错误。

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

转载于:https://www.cnblogs.com/andlife/archive/2011/06/25/2090109.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值