1. Nimm jetzt an unserem 2. ADVENT-Gewinnspiel teil - Alle Informationen findest Du hier!

Frage zu Objekten und Speicherverwaltung

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von TheEvilOne, 09.07.2010.

  1. TheEvilOne, 09.07.2010 #1
    TheEvilOne

    TheEvilOne Threadstarter App-Anbieter (In-App)

    Beiträge:
    452
    Erhaltene Danke:
    50
    Registriert seit:
    19.05.2010
    Hallo,

    kurz vorweg: Ich bin Java/RCP Entwickler und mußte mir bisher noch keine großen Gedanken um Speicherverwaltung machen, weil das bei den heutigen PC-Systemen eigentlich ja kaum noch ein Thema ist. Anders bei Android, da man hier auf den mobilen Entgeräten ja nur begrenze Resourcen zur Verfügung hat.

    Ich bin gerade dabei eine Service-Schicht für eine Android-Anwendung zu bauen, die auf einer SQLiteDatabase basiert. In dieser Datenbank gibt es mehrere Tabellen und einige Auflöser-Tabellen.

    Ich habe zu jeder Tabelle eine Objekt-Klasse und die Datenbank-Attribute dort als Variablen hinterlegt (ganz normale Table-Objekte halt, mit getter und setter). Auf die Datenbank greife ich größtenteils über die Methoden query und rawQuery zu.

    In den Auflöser-Tabellen werden die ID-Referenzen abgelegt, um eine n:m Beziehung zwischen zwei Tabellen bzw. Objekten abzubilden.

    Ich habe diese Auflöser-Tabellen nun wie folgt in einer Klasse beschrieben:

    Code:
    Auflöser-Klasse:
    
    private Long id; // primärschlüssel, zusammengesetzter PK ging in SQLiteDB irgendwie nicht
    private TblMitarbeiter mitarbeiterid;
    private TblAbrechnung abrechnungid
    
    Das Problem hier war, dass ich beim Auslesen dieser Klassen einen StackOverflowError bekam.

    Wenn ich Variablen dieser Klasse so definiere:

    Code:
    Auflöser-Klasse:
    
    private Long id;
    private Long mitarbeiterid;
    private Long abrechnungid;
    
    funktioniert alles einwandfrei. Scheinbar habe ich hier zu viele Objekte erzeugt und den Speicher überlaufen lassen.


    Noch ein anderes Beispiel:

    Code:
    Mitarbeiter-Klasse:
    
    private Long mitarbeiterid;
    private String name;
    private ArrayList<TblAbrechnung> alAbrechnung;
    
    Hier möchte ich die Abrechnungen gleich in dem Mitarbeiter-Objekt vorhalten, wenn ich das Mitarbeiter-Objekt auslese.


    Meine Fragen sind nun:

    - Sollte man beim Entwickeln unter Android generell darauf verzichten, Objekte "in" Objekten zu definieren, wie in meinem ersten Beispiel?

    - In meinem letzten Beispiel wollte ich, wenn ich die Mitarbeiter auslese, die Abrechnungen in einer ArrayListe gleich mitgeben. Sollte man darauf eher verzichten und lieber
    die Abrechnungen jedes Mal neu auslesen, wenn sie gebraucht werden?

    - Sollte man Listen und Sets generell eher sparsam verwenden, da dort ja mal locker mehrere hundert Objekte enthalten sein können, oder ist das trivial?

    Schonmal Danke und viele Grüße
     
  2. swordi, 10.07.2010 #2
    swordi

    swordi Gewerbliches Mitglied

    Beiträge:
    3,389
    Erhaltene Danke:
    441
    Registriert seit:
    09.05.2009
    ja, ein object zu erzeugen ist sehr teuer. wenn es dann veile davon gibt, wird das nicht wirklich brauchbar auf einem android gerät

    sparsam ist sicher das richtige wort. liegt immer in anwendungsfall, aber generell gilt, je weniger objekte man instanzieren muss, desto schneller. Listen und Sets benötigen auch einiges an Zeit und Speicher.
     
  3. MichaelS, 10.07.2010 #3
    MichaelS

    MichaelS Fortgeschrittenes Mitglied

    Beiträge:
    370
    Erhaltene Danke:
    51
    Registriert seit:
    14.08.2009
    Jedoch sollte man eine "gesunde" Mischung finden... jetzt komplett auf seine ordentliche Struktur zu verzichten, halte ich für "blödsinn"... Lieber ein wenig mehr Leistung verballern, als unleserlichen Code zu erzeugen... Unteranderem sollte man sich die Performance optemierung nicht zu sehr ans Herz nehmen, da ca. jedes jahr nun 20 neue Phones auf den Markt kommen, die flotter und sparsammer sind ;) Also einfach "bedacht" auf die Performance schauen und gut ist =)
     
  4. swordi, 11.07.2010 #4
    swordi

    swordi Gewerbliches Mitglied

    Beiträge:
    3,389
    Erhaltene Danke:
    441
    Registriert seit:
    09.05.2009
    google hat ein paar tipps auf der developer seite, wenn man die beherzigt, dann macht man wohl das meiste richtig
     

Diese Seite empfehlen