Autore Topic: best practice per passare dati tra activities  (Letto 1118 volte)

Offline aw4y

  • Utente junior
  • **
  • Post: 59
  • Respect: +6
    • Mostra profilo
  • Dispositivo Android:
    samsung i5500
  • Sistema operativo:
    osx/linux
best practice per passare dati tra activities
« il: 05 Settembre 2011, 21:47:12 CEST »
0
Ciao a tutti,
scrivo per chiedere la vostra opinione su quale sia la miglior soluzione per passare dati tra activity.

Ovviamente la prima e più ovvia soluzione sono i dati in bundle con l'intent.
Tuttavia si possono passare dati primitivi, anche classi serializzabili, ma leggevo a scapito delle performances in quest'ultima soluzione.

Come alternativa, ho provato ad utilizzare una classe Singleton con dei dati statici all'interno, ma ho visto che se per esempio la mia app va in background (arriva una telefonata) non è detto che trovi i dati, sebbene sia in Singleton con dati statici! Il garbage collector ha gentilmente preso risorse, nonostante non dovrebbe essere così.

Leggevo anche dell'ipotesi di piazzare un singleton / i dati statici all'interno di un service: ma fare un service solo per questo mi pare un'idea poco carina.

Infine la scrittura su file/db: ma se fossero solo dati che servono all'attuale esecuzione? (l'equivalente di una session in una web app per intenderci).

Il problema si pone perchè per esempio mi capita la seguente situazione:
-activity A che chiede dei dati e che all'azione deve chiamare l'activity B;
-prima di chiamarla però occorre che l'utente si registri (diciamo usando un'activity C);
-e quindi mi serve che A "salvi" i dati da qualche parte, poi passi a C che, dopo il login, richiama correttamente B, che legge i dati precedentemente "salvati";
(e non mi piace l'idea di passare i dati via intent pure a C, per capirci).

Scusate il post lungo, ma mi piacerebbero le vostre opinioni in proposito.

saluti
Stefano

Offline Gigiuz

  • Utente normale
  • ***
  • Post: 187
  • Respect: +23
    • Google+
    • gigiuzzo81
    • Gigiuz81
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Note III
  • Play Store ID:
    GGXSoft
  • Sistema operativo:
    Windows 7 64bit, OS X (virtualized), Ubuntu
Re:best practice per passare dati tra activities
« Risposta #1 il: 06 Settembre 2011, 04:18:55 CEST »
0
Ecco come la penso io:

[...]

Tuttavia si possono passare dati primitivi, anche classi serializzabili, ma leggevo a scapito delle performances in quest'ultima soluzione.

[...]

Sinceramente non mi risulta: utilizzando una reimplementazione di Parcelable ottieni gli stessi risultati che otterresti serializzando/deserializzando in un Intent ogni determinato membro di una classe. Parcelable non fa altro che serializzare/deserializzare i dati secondo il tuo schema: il noioso processo di stesura si serializzazione e deserializzazione praticamente lo scrivi solo una volta all'interno della classe scelta e poi ti puoi "divertire" a passarla tra le Activity senza dover impilare i vari Intent.put<tipo>() (e i conseguenti Intent.get<tipo>()).

[...]

Come alternativa, ho provato ad utilizzare una classe Singleton con dei dati statici all'interno, ma ho visto che se per esempio la mia app va in background (arriva una telefonata) non è detto che trovi i dati, sebbene sia in Singleton con dati statici! Il garbage collector ha gentilmente preso risorse, nonostante non dovrebbe essere così.

[...]

In ambiente Android non mi fido molto dei Singleton, e comunque non mi sembra un pattern ideale per contenere semplici "dati statici".

[...]

Leggevo anche dell'ipotesi di piazzare un singleton / i dati statici all'interno di un service: ma fare un service solo per questo mi pare un'idea poco carina.

[...]

Concordo

[...]

Infine la scrittura su file/db: ma se fossero solo dati che servono all'attuale esecuzione? (l'equivalente di una session in una web app per intenderci).

[...]

Se non ci sono particolari relazioni tra i dati che vuoi passare (magari trattasi di una semplice serie di settings) si possono sempre usare le SharedPreferences.

Il problema si pone perchè per esempio mi capita la seguente situazione:
-activity A che chiede dei dati e che all'azione deve chiamare l'activity B;
-prima di chiamarla però occorre che l'utente si registri (diciamo usando un'activity C);
-e quindi mi serve che A "salvi" i dati da qualche parte, poi passi a C che, dopo il login, richiama correttamente B, che legge i dati precedentemente "salvati";
(e non mi piace l'idea di passare i dati via intent pure a C, per capirci).

[...]

A me viene in mente proprio SharedPreferences :)
Hai bisogno di implementare un sistema di "codici seriali di sblocco" nella tua applicazione? Dai un'occhiata alla mia libreria: RemoteUnlocker

Offline andbin

  • Nuovo arrivato
  • *
  • Post: 11
  • Respect: +1
    • Mostra profilo
    • www.andbin.net
Re:best practice per passare dati tra activities
« Risposta #2 il: 09 Settembre 2011, 10:00:51 CEST »
0
In ambiente Android non mi fido molto dei Singleton
Ciao, supponendo il caso d'uso di un singleton per il passaggio di dati da una activity A ad un'altra activity B, l'unico scenario negativo a cui posso pensare è se durante la transizione da A a B il processo venisse proprio distrutto (e poi ricreato per eseguire B). Allora sì che per il singleton sarebbe un problema!
Purtroppo non ho ancora una conoscenza ampia/completa di Android per capire se questo può davvero succedere.
Andrea, SCJP 5 (91%) – SCWCD 5 (94%)
www.andbin.net

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +507
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:best practice per passare dati tra activities
« Risposta #3 il: 09 Settembre 2011, 10:04:07 CEST »
0
Ciao, supponendo il caso d'uso di un singleton per il passaggio di dati da una activity A ad un'altra activity B, l'unico scenario negativo a cui posso pensare è se durante la transizione da A a B il processo venisse proprio distrutto (e poi ricreato per eseguire B). Allora sì che per il singleton sarebbe un problema!

beh se il processo viene distrutto non c'è tecnica (a meno che persistere su disco in qualche modo) che tenga...

Sinceramente non mi risulta: utilizzando una reimplementazione di Parcelable ottieni gli stessi risultati che otterresti serializzando/deserializzando in un Intent ogni determinato membro di una classe.

Beh se non specifichi tu come serializzare a runtime deve andare a vedere che campi ha la classe tramite reflection e questo non incide positivamente sulle performance. Parcelable è l'alternativa lightweight, ti devi sbattere tu a scrivere come serializzare ma è un po' più efficiente.
« Ultima modifica: 09 Settembre 2011, 10:06:43 CEST da Ricky` »