【问题标题】:android disadvantages of not closing cursor不关闭光标的android缺点
【发布时间】:2012-08-07 04:40:19
【问题描述】:

我有一些关于Cursor的问题。

我想知道不关闭Cursor 的缺点是什么?

它释放资源,但释放了哪些资源?

如果我们不关闭Cursor?后果是什么,程度如何?

不关闭Cursor 不会对Activity 产生一点影响,但它会在日志猫中产生错误。

【问题讨论】:

    标签: java android sqlite android-cursor


    【解决方案1】:

    关闭Cursor 将避免任何潜在的内存泄漏,因此YES它们在不再使用时应始终关闭。

    【讨论】:

    • 不是 java 自己处理所有内存问题吗?在这种情况下有什么特殊资源?我知道它应该很接近,我只是想知道为什么?
    • A Cursor 背后有本地资源,例如文件句柄(请记住,SQLite 数据库使用索引文件)。另外,作为旁注,Cursors 应该在 finally 块中关闭,以确保它们被关闭。
    • 哪些原生资源?以及它们如何如此有害?还是不会造成严重损害?
    • 就像我说的。例如,需要关闭文件句柄以避免内存泄漏。
    【解决方案2】:

    我认为您不会因为忘记关闭一个光标而遇到很多问题。问题(这几乎适用于任何内存泄漏)是,如果你一遍又一遍地这样做,最终会发生一些不好的事情。

    例如,我编写了一个将数据从设备的 SQLite DB 上传到服务器的应用程序。如果我每次从数据库读取和写入完成时都没有关闭游标,最终我会遇到内存不足错误和其他各种问题。

    【讨论】:

      【解决方案3】:

      光标只是一个界面。很大程度上取决于实现,您使用的实现该接口的特定类...

      就 SQLiteCursor 而言,有很多东西需要清理(来自 Froyo):

      @Override
      public void close() {
          super.close();
          deactivateCommon();
          mQuery.close();
          mDriver.cursorClosed();
      }
      

      不关闭你的Cursor,数据应该还是一致的,但是你会泄露内存...

      【讨论】:

        【解决方案4】:

        如果您不关闭游标,那么您将无法访问数据库中的数据,因为当数据库打开时,如果发生 Activity 暂停或其他情况,则无法访问它。具体来说,如果让 Activity 来管理,这个问题就可以得到缓解。

        【讨论】:

        • 我没有在我的代码中关闭游标,并且它正在正确显示数据,我正在访问数据并且应用程序运行正常,它只是在 logcat 中给出错误,即最终确定游标没有被停用或关闭
        • 您的 Activity 是否控制光标意味着您是否使用了 manageCursor(X) ?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-05
        • 2012-11-25
        • 1970-01-01
        相关资源
        最近更新 更多