我使用内容提供程序/解析器,有一个单独的项目/lib,它提供了许多 DB 辅助方法。我有第二个项目/lib 可以用光标做一些方便的事情。
想象一下这样的 DB Helper Method (com.example.DBHelper):
public String[] dumpColumnTable() {
Cursor cursor = cr.query(MY_URI,
new String[] { FIELD },
null,
null,
null
);
return UtilMethods.createArrayFromCursor(cursor);
}
然后是 Util 方法(com.example.UtilMethods):
public static String[] createArrayFromCursor(Cursor cursor) {
return createArrayFromCursor(cursor, 0);
}
public static String[] createArrayFromCursor(Cursor cursor, int column) {
if (cursor == null) return null;
String[] strings = new String[cursor.getCount()];
if (cursor.moveToFirst()) {
int i=0;
do {
strings[i] = cursor.getString(column);
i++;
} while (cursor.moveToNext());
}
return strings;
}
显然光标没有关闭。这将泄漏一个游标。Logcat 会给你那个信息。
所以,在内部 util 函数中关闭它:
public static String[] createArrayFromCursor(Cursor cursor, int column) {
if (cursor == null) return null;
String[] strings = new String[cursor.getCount()];
if (cursor.moveToFirst()) {
int i=0;
do {
strings[i] = cursor.getString(column);
i++;
} while (cursor.moveToNext());
}
cursor.close();
return strings;
}
但是 logcat 仍然会声称游标在 finalize 之前没有关闭。
如果相反,在 DB Helper 方法中,我保存返回值,关闭游标,然后返回它,我不会收到游标泄漏/logcat 消息:
public String[] dumpColumnTable() {
Cursor cursor = cr.query(MY_URI,
new String[] { FIELD },
null,
null,
null
);
String[] toret = UtilMethods.createArrayFromCursor(cursor);
cursor.close();
return toret;
}
为什么 ?在调试中,当调用返回时,光标被标记为关闭。调用堆栈来自我的 activity->db helper->util 方法。db helper 和 util 方法位于与活动不同的项目中。
是否有一些我缺少的引用/值传递问题,或者跨越多个 JAR 边界,或者将 SQLiteCursor 转换为我缺少的通用 Cursor 类型?