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

Objekt-Übergreifende übergabe von ArrayList mit eigenen Objekten

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von stoli, 16.04.2012.

  1. stoli, 16.04.2012 #1
    stoli

    stoli Threadstarter Android-Experte

    Beiträge:
    503
    Erhaltene Danke:
    89
    Registriert seit:
    05.11.2010
    Hi Leute,

    Ich versuche mich gerade mit Android App Programmierung auseinander zu setzen und wollte ein Java Programm portieren.
    Mit dem Gedankengang: "Android verwendet ja auch Java, wir schon nicht so ein Problem sein" im Hinterkopf habe ich mich ans Werk gemacht.

    Aber dann traf mich der Blitz der Erkenntinis ... Java != Android-Java.

    In Java kann man wunderbar mittels setter und getter Objekten in anderen Ojekten übergben, auch komplette ArrayList mit Objekten. Andoid zeigt mir den Vogel.

    Nach ein wenig Suche bin ich auf Parcelable aufmerksam geworden. Die funktionsweise ist mir einigermaßen klar, aber dann auch wieder nicht.

    In Java hab ich das zum Beispiel so gelöst (Pseudo Code)

    Code:
    Class Spieler (String name) { 
    //Beschreibt einen Spieler und hält 
    // sein Kartendeck Mit getCardDeck erhält man die ArrayList mit
    // den Karten
    
    	cards ArrayList<Card> = new ArrayList Card;
    	this.name = name;	
    }
    
    Class Card { //Klasse welche die Karten beschreibt
    	int Farbe
    	int value
    }
    
    
    Class CardDeck { 
    //diese Klasse generiert automatisch ein Kartendeck 
    // welches mit get-Methode getCardfromDeck eine Karte abgerufen wird
    
    	cardDeck ArrayList<Card> = new ArrayList Card;
    	
    }
    
    
    Class Main {  //Die Main Class
    	
    	CardDeck carddeck = new cardDeck();
    	players ArrayList<Player> new ArrayList<Player>
    
    	player.add(new Player("a"));
    	player.add(new Player("b"));
    	player.add(new Player("c"));
    	player.add(new Player("d"));
    
    
    for {...
    	player.get(0).addCardToPlayerDeck(carddeck.getCardfromDeck()); 
    
    // Hier werden wür alle Spieler die Karten in einer Schleife zugeteilt.
    ..
    ..
    ... }
    	
    
    }
    
    
    Normalerweise konnte ich nun mit player.get(0).getCardDeck(). die komplette ArrayList des Player Objektes abrufen und sogar mit

    player.get(0).getCardDeck().get(i)... die einzelnen Karten wieder abarbeiten. Und das ging auch super über Klassen hinweg, den eigentlich möchte ich jetzt einer GUI Activity die ArrayList mit den player Objekten übergeben und mit deren Informationen die Oberfläche zeichnen, doch dazu muss ich natürlich auch an die Informationen welche in der ArrayList der Spieler mit den Karten liegt.

    Tut mir leid das ich meinen genauen Code nicht mehr verfügbar habe, aber ich hoffe es ist einigermaßen verständlich. Mir stellt sich jetzt die Frage wie ich hier mit parcelable arbeiten muss, oder gibt es hier in Android auch "einfachere" Methoden. Oder ist das schlichtweg unmöglich?

    Danke.

    Gruss
    Stoli
     
  2. DieGoldeneMitte, 16.04.2012 #2
    DieGoldeneMitte

    DieGoldeneMitte Android-Lexikon

    Beiträge:
    1,230
    Erhaltene Danke:
    256
    Registriert seit:
    05.02.2010
    Phone:
    Nexus 5X
    Tablet:
    Nexus 7 (2013)
    Im Prinzip kannst du unter Android Objekte genauso übergeben, wie du es unter Java kennst.

    Das geht nur dann nicht, wenn du zwischen verschiedenen Prozessen (sprich Apps) Daten austauschen willst. In diesem Fall musst du eine Verbindung zwischen den Prozessen aufmachen und die Daten in serialisierter Form übergeben. Ein Intent ist so eine Art Verbindung, die mittels der Parcelable-Schnittstelle dich dabei unterstützen will.

    Du kannst aber auch andere Wege geben, wie zum Beispiel java.io.Serializable implementieren (Mit den Problemen, die man auch im Desktop Java hat).

    Wenn alles innerhalb einer Appliaktion bleiben soll, kann man auch in einer statischen(globalen) Variable Daten hin- und her schaufeln. Das bringt allerdings auch Probleme mit sich, weil du über den Lifecycle deiner App nur wenig Kontrolle hast.
     
    stoli bedankt sich.
  3. stoli, 16.04.2012 #3
    stoli

    stoli Threadstarter Android-Experte

    Beiträge:
    503
    Erhaltene Danke:
    89
    Registriert seit:
    05.11.2010
    Hi,

    danke für die Antwort, das hatte ich eigentlich versucht, allerdings bekam ich den allseits beliebten NullPointerException. Werd mich heute am Abend nochmal ran machen, aber irgendwie wollte es bei meinen letzte Versuchen nicht so klappen.

    Gruss
    Stoli
     
  4. Tom299, 16.04.2012 #4
    Tom299

    Tom299 Android-Experte

    Beiträge:
    602
    Erhaltene Danke:
    120
    Registriert seit:
    31.08.2011
    Ja, ich hab mich auch schon darüber geärgert, daß man dem Intent kein eigenes Objekt mitgeben kann.

    Ich denke, für einfache Datenobjekte kann man Parceable implementieren, aber für komplexere Objekte / Listen usw. würde ich auch statische Objekte benutzen oder einfach die Datenbank mißbrauchen. Die DB-Zugriffe sind sehr schnell und haben den Vorteil, daß du vom Lifecycle her sauber bist :smile:
     
    stoli bedankt sich.
  5. stoli, 16.04.2012 #5
    stoli

    stoli Threadstarter Android-Experte

    Beiträge:
    503
    Erhaltene Danke:
    89
    Registriert seit:
    05.11.2010
    Hi Tom,

    Also liege ich doch richtig das man komplexe (selbst erstellte) Objekte nicht so einfach übergeben kann?

    Beim lesen über Parcelable und im Gedanken daran das zu implementieren, in meinem Anwendungsfall, ist mir leicht übel geworden. Ich finde das komplett ... naja ... unübersichtlich.

    Ganz ehrlich, darf ich da mal Fragen was sich Google dabei gedacht hat? Ist ja mal nicht so ein unerheblich Bestandteil einer Objektorientierten Sprache.

    Die Idee über die Datenbank finde ich interessant. Statisch, ist mir ein bisschen zu unsicher.

    Ich werde noch etwas herumexperimentieren. Falls jemand noch andere Vorschläge hat, ich nehme sie gerne an.

    Gruss
    Stoli
     
  6. swordi, 16.04.2012 #6
    swordi

    swordi Gewerbliches Mitglied

    Beiträge:
    3,389
    Erhaltene Danke:
    441
    Registriert seit:
    09.05.2009
    du kannst daten auch in dein application object speichern und von dort holen.
     
    stoli bedankt sich.
  7. stoli, 16.04.2012 #7
    stoli

    stoli Threadstarter Android-Experte

    Beiträge:
    503
    Erhaltene Danke:
    89
    Registriert seit:
    05.11.2010
    Swordi, Danke.

    Ich dachte immer das arbeiten mit Singletons sei schwer verpönt ist, aber nach deinem Beitrag habe ich mal ein bisschen gegooglet und was gefunden wo sogar ausdrücklich empfohlen wird das zu verwenden.

    Tension When I Mention: Android's Application Object as a "Singleton"

    Jetzt habe ich dank euch wieder die Qual der Wahl, Application object, Datenbank ... hossa das wird ein schöner Abend. :)

    Gruss
    Stoli
     
  8. swordi, 16.04.2012 #8
    swordi

    swordi Gewerbliches Mitglied

    Beiträge:
    3,389
    Erhaltene Danke:
    441
    Registriert seit:
    09.05.2009
    datenbank würd ich da nicht empfehlen dafür

    kann sehr langsam sein, da es ja dateizugriffe sind.
     
    stoli bedankt sich.
  9. DieGoldeneMitte, 16.04.2012 #9
    DieGoldeneMitte

    DieGoldeneMitte Android-Lexikon

    Beiträge:
    1,230
    Erhaltene Danke:
    256
    Registriert seit:
    05.02.2010
    Phone:
    Nexus 5X
    Tablet:
    Nexus 7 (2013)
    Außedem muss man Javaobjekte auch serialisieren, wenn man sie in eine DB schreibt, oder?
     
    stoli bedankt sich.
  10. stoli, 17.04.2012 #10
    stoli

    stoli Threadstarter Android-Experte

    Beiträge:
    503
    Erhaltene Danke:
    89
    Registriert seit:
    05.11.2010
    Hi,

    Danke nochmals für die Tipps, ich habe mich nun für die Methode über Application Object entschieden.
    Hat sofort funktioniert.

    Gruss
    Stoli
     

Diese Seite empfehlen