文档章节

java.lang.IllegalStateException: attempt to ~~~

今日竹石
 今日竹石
发布于 2014/04/29 13:57
字数 549
阅读 227
收藏 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
朝阳
程序员
私信 提问
1.1.1版本启动时报错

我用的是1.1.1版本elastic-job-core和elastic-job-spring,放在tomcat项目中,启动的时候报错: 信息: Illegal access: this web application instance has been stopped already. Could not......

温暖的夏天
2017/07/12
223
2
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......

lifes77
2017/12/13
601
3
1.1.1版本elastic-job启动错误

我用的是1.1.1版本elastic-job-core和elastic-job-spring,放在tomcat项目中,启动的时候报错: 信息: Illegal access: this web application instance has been stopped already. Could not......

温暖的夏天
2017/07/13
238
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
大家好,最近学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
312
1

没有更多内容

加载失败,请刷新页面

加载更多

Coding and Paper Letter(四十五)

资源整理。 1 Coding: 1.Python库gempy,一种基于Python的开源三维结构地质建模软件,它允许从界面和方向数据隐式(即自动)创建复杂的地质模型。 它还支持随机建模以解决参数和模型的不确定...

胖胖雕
35分钟前
0
0
golang 声明一个指定长度的数组,用于后续添加

很多时候我们需要声明一个指定长度的数组,用于后续添加.在使用go的时候要注意,下面的第一个例子会有报错 "non-constant array bound",应该使用第二个例子. Length 是动态的值 有报错的例子 ...

漫步海边小路
38分钟前
0
0
Java NIO示例

Server端 /** * 《构建高性能的大型分布式Java应用》 * 书中的示例代码 * 版权所有 2008---2009 */package book.chapter1.tcpnio;import java.net.InetSocketAddress;i...

月下狼
44分钟前
0
0
发布xxl-job executor dotnet core 执行器的实现

DotXxlJob [github][https://github.com/xuanye/DotXxlJob] xxl-job的dotnet core 执行器实现,支持XXL-JOB 2.0+ 1 XXL-JOB概述 [XXL-JOB][1]是一个轻量级分布式任务调度平台,其核心设计目标...

假正经哥哥
今天
5
0
mysql 查询当天、本周,本月,上一个月的数据

今天 select * from 表名 where to_days(时间字段名) = to_days(now()); 昨天 SELECT * FROM 表名 WHERE TO_DAYS( NOW( ) ) - TO_DAYS( 时间字段名) <= 1 近7天 SELECT * FROM 表名 wher......

BraveLN
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部