Android 在AsyncTaskLoader中应如何处理SQLiteDatabase连接?
我想知道在AsyncTaskLoader中何时何地打开/关闭SQLiteDatabase连接。我不觉得我完全了解加载程序的生命周期,所以我担心如果我不正确的话,我可能会遇到一些内存泄漏/NullPointerException。我当前在我的加载程序的构造函数中打开了我的SQLiteDatabase:Android 在AsyncTaskLoader中应如何处理SQLiteDatabase连接?,android,asynctaskloader,Android,Asynctaskloader,我想知道在AsyncTaskLoader中何时何地打开/关闭SQLiteDatabase连接。我不觉得我完全了解加载程序的生命周期,所以我担心如果我不正确的话,我可能会遇到一些内存泄漏/NullPointerException。我当前在我的加载程序的构造函数中打开了我的SQLiteDatabase: private class SQLiteCursorLoader extends AsyncTaskLoader<Cursor> { private String _query
private class SQLiteCursorLoader extends AsyncTaskLoader<Cursor> {
private String _queryString;
private SQLiteDatabase _db;
...
public SQLiteCursorLoader(Context context, String queryString) {
super(context);
_queryString = queryString;
_db = MySQLiteOpenHelper.getWritableDatabase();
}
....
}
私有类SQLiteCursorLoader扩展了AsyncTaskLoader{
私有字符串_queryString;
私有SQLiteDatabase_db;
...
公共SQLiteCursorLoader(上下文上下文、字符串查询字符串){
超级(上下文);
_queryString=queryString;
_db=MySQLiteOpenHelper.getWritableDatabase();
}
....
}
但是我在哪里再次关闭连接呢?可能需要复制并修改loadInBackground()
方法以使用SQLiteDatabase
/* Runs on a worker thread */
@Override
public Cursor loadInBackground() {
Cursor cursor = // Your stuff goes here <..>
if (cursor != null) {
// Ensure the cursor window is filled
cursor.getCount();
registerContentObserver(cursor, mObserver);
}
return cursor;
}
/*在工作线程上运行*/
@凌驾
公共游标loadInBackground(){
Cursor=//你的东西放在这里
如果(光标!=null){
//确保光标窗口已填充
cursor.getCount();
registerContentObserver(游标,mObserver);
}
返回光标;
}
因此我应该打开数据库,抓取光标,然后在loadInBackground()中关闭数据库all?您根本不应该关闭SQLiteDatabase实例。ContentProvider通常不会这样做。如果您有一个明确的点,您正在销毁使用SQLite数据库的所有活动和服务的资源,您应该关闭数据库,最重要的是,关闭SQLiteOpenHelper实例。因此,如果我使用SQLiteOpenHelper打开数据库,它将自动绑定到活动生命周期?不,它不会-但请注意-SQLiteOpenHelper不是您应该创建多个实例的对象(在大多数情况下会导致糟糕的结果)-您是否在多个活动中使用数据库?那么您的SQLiteOpenHelper通常应该是一个单实例-并且永远不会关闭。当然,游标和类似的东西应该被关闭。