2012-08-09 10 views
15

Mam kilka pytań dotyczących Cursor.wady na Androidzie nie zamykając kursora

Chcę wiedzieć, jakie są wady polegające na niezamknięciu numeru Cursor?

Zwolnienie zasobów, ale jakie zasoby są zwalniane?

Jeśli nie zamkniemy Cursor? Jakie będą konsekwencje i do jakiego stopnia?

Niezamknięcie numeru Cursor nie wpływa w pewnym stopniu na Activity, ale daje błąd w dzienniku kota.

Odpowiedz

-2

Jeśli nie zamkniesz kursora, będziesz mieć problemy z dostępem do twoich danych w bazie danych, ponieważ podczas gdy baza danych jest otwarta, nie będzie dostępna, jeśli coś się stanie, jak działanie zostało wstrzymane lub w inny sposób. W szczególności problem ten można złagodzić, jeśli pozwalasz zarządzać nim.

+0

Nie zamknąłem kursora w moim kodzie i poprawnie wyświetla dane, mam dostęp do danych i aplikacja działa poprawnie, podaje tylko błąd w logcat, że finalizacja kursora nie została dezaktywowana lub zamknięcie – Haris

+0

Czy podczas kontrolowania znaczenia kursora używałeś manageCursor (X)? – JoxTraex

+0

nie, działa bez zarządzaniaCursor – Haris

7

Zamknięcie Cursor pozwoli uniknąć potencjalnych wycieków pamięci, więc TAK powinny być zawsze zamknięte, gdy nie są już używane.

+0

isnt java obsługuje wszystkie problemy z pamięcią? jakie specjalne zasoby w tym przypadku? Wiem, że powinno być blisko, po prostu chcę wiedzieć dlaczego? – Haris

+0

'' Cursor' ma rodzime zasoby, takie jak uchwyt pliku (pamiętaj, baza danych SQLite używa plików zindeksowanych). Również, na marginesie, 'Cursor's powinien być zamknięty w bloku' finally', aby zagwarantować, że zostaną zamknięte. –

+1

które zasoby macierzyste? i jak są one tak szkodliwe? lub nie powodują ekstremalnych uszkodzeń? – Haris

3

Kursor jest tylko interfejsem. Wiele zależy od implementacji, jakie konkretne klasy, która implementuje ten interfejs używasz ...

W przypadku SQLiteCursor, istnieje sporo rzeczy uzyskiwanie oczyszczone-up (to z Froyo):

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

nie zamykając kursor, dane powinny nadal być spójne, ale idziesz do wycieku pamięci ...

3

nie sądzę, zobaczysz wiele problemów z zapominając zamknąć jeden kursor. Problem (i dotyczy to prawie każdego wycieku pamięci) polega na tym, że jeśli ciągle to robisz, w końcu stanie się coś złego.

Na przykład napisałem aplikację, która przesyła dane z SQLite DB urządzenia do serwera. Jeśli nie zamknęłbym kursora za każdym razem, gdy skończyłem czytać i pisać z bazy danych, w końcu natknąłem się na błędy braku pamięci i różne inne problemy.