格式化

廣告

廣告2

2012年1月27日 星期五

[Android app開發基本概念] sqlite中"close() was never explicitly called on database"

主要的原因是因為SQLiteOpenHelper實例化物件,沒有顯式的關閉,而且我自己在很多方法中都new出了不同的SQLiteOpenHelper實例物件。這樣就會有可能出現,前面一個SQLiteOpenHelper物件沒有釋放出資源,而後面的一個SQLiteOpenHelper物件也同時開始對資料庫進行讀寫了,就很可能會引起預想不到的bug。


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就相當於一把鎖,一個類別中,同時指定這把鎖的同步方法不能同時被同一個物件訪問。

沒有留言 :