Att passa data från en activity till en annan?

Diskussion i 'Frågor, support och diskussion' startad av UncleRedz, 13 mar 2010.

  1. UncleRedz

    UncleRedz Kid Droid Medlem

    Blev medlem:
    7 jun 2009
    Inlägg:
    63
    Mottagna gillanden:
    5

    MINA ENHETER

    Hej,

    Jag håller på att städa upp min app och försöker få bort Android nybörjar misstagen. :) Så här är en fråga till er som skrivit lite appar redan.

    Vad är det enklaste och bästa sättet att skicka data från en Activity till en annan? Datan måste förståss in i en Intent och dess Bundle. Vilket är lätt med simpel data, så som någon boolean, sträng eller två.

    Men när datan består av ett objekt som innehåller mer eller mindre komplex data, så blir det genast mer omständigt, eftersom objektet och dess innehåll måste "plattas" ut för att sparas i en Bundel.

    Just nu har jag en konverterings klass som tar ett data objekt och sparar datan i en Bundel och tvärt om. Nackdelen med detta är att om man lägger till, ändrar eller tar bort någon data från objektet så måste man komma ihåg att uppdatera konverterings klassen, så att ingen data försvinner vid konverteringen.

    Ett steg upp från detta, som jag nyligen förstått, är att använda Parcelable mekanismen och på det viset "platta" ut data objektet. Men i princip är det samma sak som att använda en konverterings klass, man måste likväl handskriva läsning/skrivning till ett Parcel/Bundel.

    Är Parcelable och Parcel as good as it gets?

    Kan man inte bara göra data objekten Serializable? Och på den vägen få konverteringen automatisk och därmed slippa manuella konverterings fel? Eller det är för prestanda/minnes-ineffektivt?

    /Redz
     
  2. johannilsson

    johannilsson Adult Droid Medlem

    Blev medlem:
    23 jun 2009
    Inlägg:
    577
    Mottagna gillanden:
    8

    MINA ENHETER

    Själv kör jag lite mix av alla möjliga typer, finns bra men kort referens i docsen som beskriver de olika typerna med.

    T.ex. i iglaset appen implementerar vi Parcelable direkt på de objekt som vi vet kommer flyttas mellan olika activities. Man kan såklart ha konverteringsklasser med, men jag tycker helt enkelt att det är smidigare att ha det så här.

    Vet inte om Serializable funkar rakt av, men min gissning är att det helt enkelt är dyrare än att köra med Parcelable då du där beskriver hur serialiseringen går till.

    Om du har pillat med Oracles Coherence så finns där även vissa likheter med ParcelableS och deras PortableObjectS om det skulle hjälpa att förstå konceptet bättre.
     
  3. Jompe71

    Jompe71 Kid Droid Medlem

    Blev medlem:
    11 jun 2009
    Inlägg:
    48
    Mottagna gillanden:
    0

    MINA ENHETER

    Oavsett ramverk måste inte mottagande Activity "känna till" vad du skickar?

    Om du serializerar dina klasser måste ju mostsvarande klasser finnas i den andra appen.

    Är det inte bättre att anta att mottagande app inte vet någonting om din apps data och göra en "lös" koppling, d.v.s. utan Java bindning med ett dataformat som är generellt, XML, JSON m.fl.

    På så sätt kan du "versionshantera" ditt data. En del i datat beskriver vilken version du skickar. Antingen implementerar mottagaren versionen eller inte och kan ge ett bra felmeddelande. Alternativt skickar du fler format på en gång och mottagaren kan själv välja. Tänk Maven så kanske du försår mer vad jag menar...

    Själv kan jag rekommendera JSON som databärare. Riktigt enkelt, mindre i datamängd mot XML ( oftast ) och du hittar 3de parts libbar till Java lätt. Mitt senaste spel är HELT uppbyggt på JSON som dataformat ( En liten parantes i parantesen ).
     
  4. johannilsson

    johannilsson Adult Droid Medlem

    Blev medlem:
    23 jun 2009
    Inlägg:
    577
    Mottagna gillanden:
    8

    MINA ENHETER

    Jag håller med dig i teorien, men att köra json, xml eller kanske csv och versionshantera data mellan olika activities känns för mig onödigt. Skulle jag vilja dela data mellan två appar i Android hade jag funderat på att köra med ContentProviderS istället. Om man ska som du beskriver skicka mellan två olika platformar så håller jag med om kontraktet ska vara plattformsoberoende och kanske tom versionerat.
     
  5. UncleRedz

    UncleRedz Kid Droid Medlem

    Blev medlem:
    7 jun 2009
    Inlägg:
    63
    Mottagna gillanden:
    5

    MINA ENHETER

    Bra reference länk, blir lite tydligare vilka olika lösningar som finns. Blir troligen en blandning för min del också.

    Val av metod att skicka datan beror, för min del, till stor del hur den används. Internt i applikationen så kan man, att dömma av reference länken, helt skippa konverteringen av datan och använda global state för att hålla datan istället. Men för publika activities som andra applikationer kan anropa så är det förståss en annan femma, samma sak med persistent data.
     
    Last edited: 13 mar 2010