解决android sqlite 中"close() was never explicitly called on database" 与java线程同步
来源:互联网 发布:百里守约 知乎 编辑:程序博客网 时间:2024/06/06 04:02
在最近一个程序的开发 中,在eclipse中看到了下面的异常信息,虽然没有引起 程序崩溃,但还是值得重视
close() was never explicitly called on database
网上查了一些资料,主要的原因是因为创建的SQLiteOpenHelper实例化对象,没有显式的关闭,而且我自己在很多方法中都new出了不同的SQLiteOpenHelper实例对象。这样就会有可能出现,前面一个SQLiteOpenHelper对象没有释放出资源,而后面的一个SQLiteOpenHelper对象也同时开始对数据库进行操作了,可能会引起预想不到的bug。
依然是参考网上的解决方案,比较简单,创建SQLiteOpenHelper对象的单例模式;
public static synchronized HistorySqilte getHelper(Context context) { if (mOpenHelper == null) mOpenHelper = new HistorySqilte(context); return mOpenHelper; }这样之后,每次需要SQLiteOpenHelper对象时,只需要调用该静态方法就行了,加上方法同步,可以保证在整个应用中只会有这么一个实例。
在这里顺便提一下java的线程同步,java的线程同步是用的关键字synchronized,synchronized可以用来修饰一个方法,
如果是synchronized method(){}, 那么某一个类的某一个实例化对象就不可以同时访问这个类中所有的这种方法,只有获得这对象的锁之后才能访问这样的方法,当然如果一个类new出了几个对象,那么这些不同的对象同时访问一个方法是可以的。
如果是synchronized static method(){}, 这种静态的同步方法,那么这个类的任何对象都不能同时访问这类同步方法。
synchronized 关键字还能修饰方法中的某一块区域,synchronized(object){/*区域块*/},这里的object就相当于一把锁,一个类中,同时指定这把锁的同步方法不能同时被同一个对象访问。
上面的内容都是关于之前SQLiteOpenHelper异常的一些知识上的延伸,后续还有相关理解,继续补充。
- 解决android sqlite 中"close() was never explicitly called on database" 与java线程同步
- Android SQLite - close() was never explicitly called on database
- android SQLite :close() was never explicitly called on database 'XXXXXX'
- close() was never explicitly called on databaseandroid.database.sqlite异常
- FAQ_21 sqlite exception: close() was never explicitly called on database
- SQLite: close() was never explicitly called on database
- 处理Android SQLite - close() was never explicitly called on database异常
- 处理AndroidSQLite-close()was never explicitly called on database异常
- close() was never explicitly called on database,SQLiteMisuseException
- close() was never explicitly called on database 和 database is locked 错误原因
- close() was never explicitly called on database 和 database is locked 错误原因
- close() was never explicitly called on database 和 database is locked 错误原因
- close() was never explicitly called on database '/data/data/com.example.shiyan/databases/njupt.db'
- close() was never explicitly called on database '/data/data/com.seehope.view/databases/note.db' 异常
- Android异常解决--A WebView method was called on thread 'JavaBridge'. All WebView methods must be called
- Android中使用ON CONFLICT REPLACE同步数据到SQLITE
- Android中使用ON CONFLICT REPLACE同步数据到SQLITE
- Android解决异常: startRecording() called on an uninitialized AudioRecord.
- 不用缓冲的IO和用缓冲的IO
- Eclipse中安装Maven插件 M2eclipse
- Linux时钟处理机制
- poj 1519
- 使用VirtualBox安装Android 4.2.2 x86
- 解决android sqlite 中"close() was never explicitly called on database" 与java线程同步
- 一致性哈希算法
- linux-2.6.32在mini2440开发板上移植(2)之移植yaffs2
- 一直想在RAM中跑uboot,省事,没想到
- v$sqltext
- java从零开始之一
- ubuntu无法安装vim软件包
- This class is not key value coding-compliant
- tomcat内存溢出解决