在哪里关闭光标?

时间:2012-12-12 10:36:06

标签: android memory-leaks cursor

我在下面的代码中使用了一个游标。但是我希望在使用它之后关闭它,不再需要它。问题是游标在return语句中使用,但我不能在return语句之后关闭它,因为这是无法访问的代码。它在return语句中使用,所以我不能在它上面关闭它。如何关闭光标?这与旧的managedQuery不同,我假设您必须关闭它。

   public String getPath(Uri uri) {
    String[] projection = { MediaStore.Audio.Media.DATA };
    Cursor cursor = getContentResolver().query(uri, projection, null, null, null);
    int column_index = cursor
            .getColumnIndexOrThrow(MediaStore.Audio.Media.DATA);
    cursor.moveToFirst();
    return cursor.getString(column_index);
      // cursor.close() <--- not possible because it is unreachable code after return
}

5 个答案:

答案 0 :(得分:2)

您可以将其分配给String对象,然后关闭光标并将其返回。

cursor.moveToFirst();
String result = cursor.getString(column_index);
cursor.close();
return result;

答案 1 :(得分:1)

使用finally块对你有用吗?我对你的特定问题没有经验,但是你可以把你的清理放在finally块中,否则会被return语句绕过:

http://docs.oracle.com/javase/tutorial/essential/exceptions/finally.html

只是一个想法!如果没有,请不要开枪!

答案 2 :(得分:1)

尝试 - 最后救援......

public String getPath(Uri uri) {

  Cursor cursor = null;

  try {
    String[] projection = { MediaStore.Audio.Media.DATA };
    cursor = getContentResolver().query(uri, projection, null, null, null);
    int column_index = cursor
            .getColumnIndexOrThrow(MediaStore.Audio.Media.DATA);
    cursor.moveToFirst();


    return   cursor.getString(column_index);
    }
    finally {
     if (cursor != null)
        cursor.close(); // close the cursor
    }


 }

注意

刚才注意到下面的另一个答案.. 如果您在某个活动中,可以致电startManaginCursor()并传递cursor个实例,以便Android管理其生命周期。如果您无法访问Android应用程序上下文(例如:代码在实用程序类中),请使用上述方法。 (并撒上一些错误处理;))

答案 3 :(得分:0)

好吧,如果你每次都在同一个Activity上创建一个新实例(虽然我不确定它是一个很好的编程习惯)。一旦完成遍历/遍历行/列,就可以关闭光标。别忘了使用:

   startManagingCursor(cursor);

答案 4 :(得分:0)

if(this.daoDatabase!= null){

        final Cursor genericCursor = this.daoDatabase.query(this.tableName, null, null, null, null, null, orderByCriteria);

        if (genericCursor != null) {
            if (genericCursor.moveToFirst()) {
                do {
                   // do stuff...
                } while (genericCursor.moveToNext());
            }
            genericCursor.close();
        }
    }