1

我使用内容提供程序/解析器,有一个单独的项目/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 类型?

4

0 回答 0