我有一個使用SQL數據庫的應用程序。這是由SQLiteOpenHelper類封裝的。當啓動屏幕啓動時,它將調用DataProvider類的init,該類存儲SQLiteOpenHelper的受保護靜態實例。初始化只是調用SQLiteOpenHelper的構造函數:Android生命週期和空指針問題
public class UKMPGData extends SQLiteOpenHelper
{
public UKMPGData(Context context, String databaseName)
{
super(context, databaseName, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db)
{
//create table and set up triggers etc
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
onCreate(db);
}
}
public class UKMPGDataProvider
{
protected static UKMPGData uKMpgData;
public static void init(Context aApplicationContext, String aDatabaseName)
{
uKMpgData = new UKMPGData(applicationContext, databaseName);
}
public static void close()
{
uKMpgData.close();
}
}
然後我有兩個班進一步擴展其與UKMPGDataProvider因此不得不進入uKMpgData。這些類從數據庫中檢索和存儲特定類型的數據。例如。
public class VehicleDataProvider extends UKMPGDataProvider
{
public static Cursor getVehicles()
{
Cursor cursor = null;
SQLiteDatabase db = uKMpgData.getReadableDatabase();
cursor = db.query(VEHICLE_TABLE_NAME, GET_VEHICLES_FROM_CLAUSE, null, null, null, null, ORDER_BY);
return cursor;
}
//...
}
這一切似乎正常工作,直到我注意到,如果應用程序正在運行,然後被迫到後臺,如果它被放置數個小時,當應用程序被帶回前臺我會在一個名爲getVehicles()的Activity類中獲得一個空指針(見上文)。事實證明,uKMpgData不再引用一個對象。
據我所知,Android可以在需要時終止進程,但不明白我的應用程序發生了什麼以獲取空指針 - 如果我的應用程序的進程被終止,那麼應用程序的新實例被啓動?換句話說,新的SplashScreen將初始化數據庫對象,因此不會出現空指針異常。
我必須缺少一些東西 - 我的應用程序在回收內存(對數據庫對象的引用)時顯示最後一次可見活動時的狀態。
順便提一下,現在修正了這個錯誤。 VehicleDataProvider和其他類似的類不再擴展超類數據提供程序(UKMPGDataProvider),該提供程序現在擁有對ukMpgData的專用引用。所有觸及數據庫的方法現在都會通過UKMPGDataProvider,如果需要,它將檢查null並重新初始化。
由於提前, 巴里
這聽起來像我正在尋找的答案。謝謝。 – barry 2012-03-10 14:13:47