关闭JAR边界的游标

时间:2013-03-06 15:30:14

标签: android cursor android-contentprovider memory-leaks

我使用内容提供程序/解析程序,有一个单独的项目/ lib,它提供了许多DB帮助程序方法。我有一个第二个项目/ lib,用光标做一些方便的东西。

想象一下这样的DB Helper方法(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仍会声称游标在最终确定之前没有关闭。

如果相反,在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类型?

0 个答案:

没有答案