Jetzt kostenlos registrieren. Mitglieder surfen ohne Werbung auf Android-Hilfe.de!
Zurück   Android-Hilfe.de > Android Developer > Android App Entwicklung

Cursor schließen

Das Thema "Cursor schließen" befindet sich unter Android App Entwicklung auf Android-Hilfe.de.


Antwort

 

Themen-Optionen Ansicht
Alt 09.02.2012, 14:12   #1 (permalink)
Android-Hilfe.de Mitglied

Registriert seit: 31.10.2011
Beiträge: 85
Abgegebene Danke: 3
Erhielt 0 Danke für 0 Beiträge
Standard Cursor schließen

hallo Android Freunde,
in meiner App habe ich mehrere Klassen wo ich auf die Datenbank zugreife. in jeder Klasse habe ich die Funktion onDestroy () umgeschrieben in
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
c.close();
baseHelper.close();
}
das funktioniert aber, ich kriege komischerweise nur bei einer Klasse

02-09 14:03:16.229: E/Database(2219): close() was never explicitly called on database '/data/data/de.meinautohaus/databases/autohausDB.db'

wobei die Funktion onDestroy () auch in der Klasse ist.
Bei allen anderen Klassen klappt es ohne Probleme
zblack ist offline   Mit Zitat antworten
Alt 09.02.2012, 14:21   #2 (permalink)
Android Guru

Modell: T-Mobile G1, Nexus One, Samsung Galaxy Tab 10.1, Samsung Galaxy Nexus

Registriert seit: 04.05.2009
Beiträge: 1.599
Abgegebene Danke: 128
Erhielt 210 Danke für 193 Beiträge
Standard AW: Cursor schließen

Ist diese eine Klasse auch eine Activity?
__________________
Follow/Add/Circle/Whatever me on Google+

Solitaire HD, ein Solitaire optimiert für Honeycomb.
the_alien ist offline   Mit Zitat antworten
Alt 09.02.2012, 14:23   #3 (permalink)
Android-Hilfe.de Mitglied

Registriert seit: 31.10.2011
Beiträge: 85
Abgegebene Danke: 3
Erhielt 0 Danke für 0 Beiträge
Standard AW: Cursor schließen

ListActivity
zblack ist offline   Mit Zitat antworten
Alt 09.02.2012, 15:03   #4 (permalink)
Fortgeschrittenes Mitglied

Modell: Samsung Galaxy S und Galaxy 5

Registriert seit: 31.03.2011
Beiträge: 480
Abgegebene Danke: 35
Erhielt 89 Danke für 73 Beiträge
Standard AW: Cursor schließen

Führe
Code:
super.onDestroy()
Mal als letztes aus. Die Activity wird sonst zerstört, bevor der ganze Code ausgeführt wurde.
JanF ist offline   Mit Zitat antworten
Alt 11.02.2012, 17:55   #5 (permalink)
Android-Hilfe.de Mitglied

Modell: Acer Iconia A100

Registriert seit: 28.10.2011
Beiträge: 127
Abgegebene Danke: 15
Erhielt 13 Danke für 11 Beiträge
Standard AW: Cursor schließen

Auf stackoverflow.com gibt es unzählige Fragen zu dem Thema. Wundert mich dass dieses Thema hier so selten auftaucht.

Im Prinzip gehts darum, dass Du einen Cursor oder db leak hast. Klassischer Memoryleak. Da Java einen garbage collector hat, ist dass natürlich kein fataler Fehler, allerdings denke ich schon, dass Du den beheben solltest.

Erstmal:
Dieser Fehler taucht erst im Error Log auf seit startManagingCursor(Cursor cursor) deprecated ist. (Seit Honeycomb).
Bis Honeycomb sollte obige Methode den Cursor an den Lebenszyklus der Activity binden. Dadurch sollte das Schliessen des Cursor automatisch geschehen. Hat bei mir (und wohl auch bei anderen) nie richtig funtioniert, daher wurde die Methode deprecated.
Stattdessen soll jetzt die CursorLoader API verwendet werden (ab Honeycomb) und für ältere API Levels in Verbindung mit der Android Combatibility Library (und Reflections API).
Das finde ich aber ziemlich Overkill. Zu dem gilt die Reflections API nicht als besonders performant.
Leider habe ich für diesen Error keine richtige 100% Lösung gefunden, ausser folgende:
db open
cursor query
Array mit cursor daten füllen
cursor close
db close
Array mittels ArrayAdapter an die ListView binden

Alles unmittelbar, so hast Du 100% Kontrolle das nix leaked.

Hat natürlich einen massiven Nachteil:
Listviews können dann natürlich nicht direkt mit Cursor gefüllt werden. Muss dann einen Array mit dem Cursor füllen und den Array via ArrayAdapter mit der ListView. Nix mit Live Data! Bei reinem Lesezugriff funktioniert das natürlich, und Du brauchst dann auch keinen SimpleCursorAdapter mehr. (Der ist nähmlich seit Honeycomb auch deprecated) .
Zweiter Nachteil natürlich:
Das Öffnen der db und des cursor ist eine teuere Operation. Wenn Du das oft machen musst, natürlich suboptimal.

Vorteile:
Keine Cursor oder db Leaks mehr und keine Errors im Log.
Keine verwendung von deprecated Methoden oder Klassen.

Wenn hier jemand weiss, wie man den Cursor/db elegant ohne Leaks an den Lebenszyklus bindet, wäre ich für Erleuchtung sehr dankbar...
__________________
Samsung Galaxy S mit Android 4.03 RC4 ICSSGS
Acer Iconia A100 mit Android 3.2
Vodafone 858 smart mit Android 2.2.1

Geändert von mradlmaier (11.02.2012 um 18:04 Uhr)
mradlmaier ist offline   Mit Zitat antworten
Alt 11.02.2012, 17:59   #6 (permalink)
Android-Hilfe.de Mitglied

Modell: Acer Iconia A100

Registriert seit: 28.10.2011
Beiträge: 127
Abgegebene Danke: 15
Erhielt 13 Danke für 11 Beiträge
Standard AW: Cursor schließen

Zitat:
Zitat von zblack Beitrag anzeigen
hallo Android Freunde,
in meiner App habe ich mehrere Klassen wo ich auf die Datenbank zugreife. in jeder Klasse habe ich die Funktion onDestroy () umgeschrieben in
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
c.close();
baseHelper.close();
}
das funktioniert aber, ich kriege komischerweise nur bei einer Klasse

02-09 14:03:16.229: E/Database(2219): close() was never explicitly called on database '/data/data/de.meinautohaus/databases/autohausDB.db'

wobei die Funktion onDestroy () auch in der Klasse ist.
Bei allen anderen Klassen klappt es ohne Probleme
Beachte: Da dieser Fehler durch den Garbage Collector ausgelöst wird, ist es leider nicht ganz eindeutig, wo der Cursor leaked. Kannste leicht mit verschiedenen Androiden testen: Je weniger Speicher, desto häufiger läuft der gc, und desto öfter steht der Error im Error Log.
__________________
Samsung Galaxy S mit Android 4.03 RC4 ICSSGS
Acer Iconia A100 mit Android 3.2
Vodafone 858 smart mit Android 2.2.1
mradlmaier ist offline   Mit Zitat antworten
Antwort

Stichworte
-

Themen-Optionen
Ansicht


Ähnliche Themen

Thema Autor Forum Antworten Letzter Beitrag
Tastaturlupe / Cursor? tomi.omni Android Ice Cream Sandwich 4 27.12.2011 19:09
Fehler in DB Cursor? Tom299 Android App Entwicklung 0 24.11.2011 09:48
Cursor-Tasten naturelle Motorola Xoom Forum 3 31.08.2011 16:49
Cursor bewegen androididi LG P500 Optimus One Forum 3 15.11.2010 20:58
Cursor schließen? so.r.u Android App Entwicklung 5 06.04.2010 18:41




Du liest gerade: "Cursor schließen" unter "Android App Entwicklung" auf Android-Hilfe.de.


Powered by vBulletin®
Copyright ©2000 - 2012, vBulletin Solutions, Inc.
Search Engine Friendly URLs by vBSEO
© Android-Hilfe.de 2012 - All rights reserved.