解决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异常的一些知识上的延伸,后续还有相关理解,继续补充。



原创粉丝点击