【问题标题】:When to close cursor in Android?什么时候在Android中关闭光标?
【发布时间】:2011-05-06 14:48:45
【问题描述】:

我有一个应用程序,它使用光标通过rawQuery 从 SQLite DB 中选择数据以填充 Android 中的 ListView。每次用户单击列表视图项时,我都会创建一个新的 Activity 实例来重新填充列表视图。

调用cursor.close()db.close() 来避免内存问题会更好吗?我实际上在我的活动的OnDestroy() 中有db.close()

【问题讨论】:

标签: android database-cursor


【解决方案1】:

在您的方法中检索到该特定对象的值后,您可以关闭cursor

顺便说一句...您不必每次都为用户单击事件重新创建listview。只需通知列表视图上设置的适配器数据发生了一些变化。

类似

youradaptername.notifyDataSetChanged();

这应该会自动重新填充你的 listview 中的内容。

【讨论】:

  • 在哪里添加这一行 youradaptername.notifyDataSetChanged();? oncreate() 还是 setitemclicklistener?
  • notifyDataSetChanged() 需要在您知道适配器中的数据已更改时调用。这将强制列表视图重新绘制其视图,从而帮助您查看列表中的新数据。您将在哪里调用 notifyDataSetChanged() 取决于您的需要。示例参考此帖stackoverflow.com/questions/16441298/…
【解决方案2】:

如果您每次都为同一个 Activity 创建一个新实例(尽管我不确定这是一个好的编程习惯)。完成遍历/迭代列表视图的源后,您可以关闭光标。

例子:

示例实现类似于

//Pre cursor code
startManagingCursor(cursor);
if (cursor.moveToFirst()) {
    do {
        if (cursor.getString(0).equals(value)) {
            cursor.close();
            a = true;
            return a;
        }
    } while (cursor.moveToNext());
}

//Close cursor here, when its work is complete
cursor.close();

//Post cursor code ...

【讨论】:

  • 将 cursor.close() 包装在 finally 子句中始终是一个好习惯。这样,无论在处理过程中是否抛出 RuntimeException,您都可以确保您的光标已关闭。
猜你喜欢
  • 1970-01-01
  • 2010-10-23
  • 2010-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-05
  • 2015-05-26
  • 1970-01-01
相关资源
最近更新 更多