文档章节

java.lang.IllegalStateException: attempt to ~~~

今日竹石
 今日竹石
发布于 2014/04/29 13:57
字数 549
阅读 223
收藏 0

具体bug如下:
java.lang.IllegalStateException: attempt to re-open an already-closed object: android.database.sqlite.SQLiteQuery (mSql = SELECT PackageName, Version, CtrlStatus FROM cooee_hide_packs) 
	at android.os.Parcel.readException(Parcel.java:1330)
	at android.os.Parcel.readException(Parcel.java:1276)
	at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:1351)
	at android.app.Instrumentation.execStartActivity(Instrumentation.java:1374)
	at android.app.Activity.startActivityForResult(Activity.java:2827)
	at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:817)
	at android.app.Activity.startActivity(Activity.java:2933)
	at cn.app.activity.news.BaseActivity.onClick(Xs8_News_BaseActivity.java:257)
	at android.view.View.performClick(View.java:2485)
	at android.view.View$PerformClick.run(View.java:9080)
	at android.os.Handler.handleCallback(Handler.java:587)
	at android.os.Handler.dispatchMessage(Handler.java:92)
	at android.os.Looper.loop(Looper.java:130)
	at android.app.ActivityThread.main(ActivityThread.java:3714)
	at java.lang.reflect.Method.invokeNative(Native Method)
	at java.lang.reflect.Method.invoke(Method.java:507)
	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:853)
	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:611)
	at dalvik.system.NativeStart.main(Native Method)

        这个错误出现的原因是因为我在一个数据库查询方法中调用了另一个数据库查询方法,我的数据库查询方法都是在开始的时候获取SQLiteDatabase对象,在结束的时候关闭SQLiteDabse对象,结果内部的数据库查询方法在结束的时候直接关闭了SQLiteDatabase对象,导致外面的数据库查询操作报错,在这里大家不要以为多获取了几个SQLiteDatabase对象就可以了,每个线程只能使用一个SQLiteOpenHelper,也就使得每个线程使用一个SQLiteDatabase对象(多线程操作数据库会报错);

        解决办法就是我不再关闭内部数据库查询方法的SQLiteDatbase对象或者将那个方法直接集成到外面的查询方法中,当然,要确保这个查询方法只会出现其他数据库查询方法中,要是单独用这个方法,反而会因为SQLiteDatabase对象没有关闭而报错;

 

产生原因:

      假如你有A、B两个异步线程操作sqlite数据库。A是读取,B是写入,当A完成读的时候调用close(),而B在这时正在执行写的方法就会出现下面的异常。有人说去掉单例模式可以解决这个问题,但你不能忘记你在怎么单例使用的数据库还是同一个,避免不了。

解决办法:

     如果你在一定的时间内需要重复的操作数据库,那么不要调用close()方法,关闭游标就可以了。在你Activity注销或者真正不再需要的时候调用数据库的colse()方法.


© 著作权归作者所有

共有 人打赏支持
今日竹石
粉丝 41
博文 227
码字总数 181312
作品 0
朝阳
程序员
私信 提问
springboot整合dubbo启动报错

13-Dec-2017 13:46:28.796 信息 [RMI TCP Connection(127.0.0.1:2181)] org.apache.catalina.loader.WebappClassLoaderBase.checkStateForResourceLoading Illegal access: this web applic......

冰峰雪座
2017/12/13
108
3
大家好,最近学tomcat,jsp,servlet的时候老碰到这样的错误,求经验丰富的人帮忙解答阿,thanks so much!

Illegal access: this web application instance has been stopped already. Could not load com.mysql.jdbc.Util. The eventual following stack trace is caused by an error thrown for d......

无名人士
2011/09/27
290
1
android 操作本地数据库报错

writeSqlitedb = myOpenHelper.getWritableDatabase(); //实例化数据库 writeSqlitedb.delete 程序运行到标红的位置就报下面的错误,百度了下,好像因为使用了多线程后,就容易出现这样的错误...

天王盖地虎626
2015/04/14
99
1
帮忙看下这个日志。谢谢了

@Jfinal [WARN]2015-04-21 17:53:34-[Thread: com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1]-[com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask.run()]:★ ......

chi_9
2015/04/22
1K
3
上线报错,凌晨1点到7点,还未解决,求高人指点,在线等!!!

奶奶的,测试环境都运行正常,都是linux系统,部署到生产直接报下面做,百度了下有类似错,但只是类似和我一样错的一晚上都没找到,试了半天还是不行,请高人指点!!! 架构:spring+hibern...

达不溜H
2014/12/11
5.6K
18

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周日乱弹 —— 懒床是对冬天最起码的尊重

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @瘟神灬念 :分享daniwellP/桃音モモ的单曲《Nyan Cat》 《Nyan Cat》- daniwellP/桃音モモ 手机党少年们想听歌,请使劲儿戳(这里) @巴拉迪...

小小编辑
今天
48
2
码云项目100,水一发

简单回顾一下: 早期构想最多的,是希望能将PHP一些类和编码分区做得更细,所以很多尝试。但不得不说,PHP的功能过于单一,是的,也许写C/C++扩展,可以解决问题,那我为什么不用C#或者Golan...

曾建凯
今天
4
0
Spring应用学习——AOP

1. AOP 1. AOP:即面向切面编程,采用横向抽取机制,取代了传统的继承体系的重复代码问题,如下图所示,性能监控、日志记录等代码围绕业务逻辑代码,而这部分代码是一个高度重复的代码,也就...

江左煤郎
今天
4
0
eclipse的版本

Eclipse各版本代号一览表 Eclipse的设计思想是:一切皆插件。Eclipse核心很小,其它所有功能都以插件的形式附加于Eclipse核心之上。 Eclipse基本内核包括:图形API(SWT/Jface),Java开发环...

mdoo
今天
3
0
SpringBoot源码:启动过程分析(一)

本文主要分析 SpringBoot 的启动过程。 SpringBoot的版本为:2.1.0 release,最新版本。 一.时序图 还是老套路,先把分析过程的时序图摆出来:时序图-SpringBoot2.10启动分析 二.源码分析 首...

Jacktanger
今天
12
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部