2012-08-09 36 views
15

我有一些關於Cursor的問題。android沒有關閉遊標的缺點

我想知道是不是關閉Cursor的缺點是什麼?

它重新分配資源,但釋放什麼資源?

如果我們不關閉Cursor?會有什麼後果和在多大程度上?

未關閉Cursor稍微不影響Activity,但它在log cat中給出錯誤。

回答

-2

如果不關閉遊標,那麼你將有訪問您的數據的問題在你的數據庫,因爲在數據庫是開放的,它不應該訪問的東西發生這樣的活動被暫停或以其他方式。具體來說,如果您讓活動管理它,則可以緩解此問題。

+0

我havnt關閉了我的代碼中的遊標,它正在正確顯示數據,我正在訪問數據和應用程序運行正常, 它只是在logcat中發生錯誤完成遊標尚未停用或關閉 – Haris 2012-08-09 21:32:20

+0

是您的控制遊標含義的活動是否使用了manageCursor(X)? – JoxTraex 2012-08-09 22:22:13

+0

不,它工作時沒有管理遊標 – Haris 2012-08-10 07:11:33

7

關閉Cursor將避免任何潛在的內存泄漏,所以它們在不再使用時應始終關閉。

+0

isnt java本身處理所有內存問題?在這種情況下有什麼特殊資源?我知道它應該接近,我只是想知道爲什麼? – Haris 2012-08-09 21:40:08

+0

'Cursor'具有本機資源,如文件句柄(請記住,SQLite數據庫使用索引文件)。另外,作爲一個附註,'遊標'應該在'finally'塊中關閉以確保它們關閉。 – 2012-08-09 22:50:09

+1

哪些原生資源?以及它們如何有害?或不會造成極度的傷害? – Haris 2012-08-10 07:15:55

3

光標只是一個接口。這在很大程度上取決於執行情況,有什麼具體的類,它實現您所使用的接口...

在SQLiteCursor的情況下,有相當多的事情讓清理後(這是從升級Froyo):

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

不關閉你的光標,數據仍然應該是一致的,但你會泄漏內存...

3

我不認爲你會看到從忘記關閉一個遊標的許多問題。這個問題(這幾乎適用於任何內存泄漏)是,如果你一遍又一遍地做,最終會發生一些不好的事情。

例如,我寫了一個應用程序從設備的的SQLite數據庫是數據上傳到服務器。如果我每次完成從數據庫讀取和寫入的操作都沒有關閉遊標,最終會遇到內存不足錯誤和其他各種問題。