2012-02-21 11 views
5

sto cercando di passare i dati da un'attività all'altra tramite Intent.putExtras come questo:Limite dimensioni Intent.putExtras?

private ArrayList<HashMap<String, String>> mGroups = new ArrayList<HashMap<String, String>>(); 
private ArrayList<HashMap<String, String>> mUsers = new ArrayList<HashMap<String, String>>(); 
... 

Bundle data = new Bundle(); 
data.putInt("mode", mode); 
data.putSerializable("groups", (Serializable) mGroups); 
data.putSerializable("users", (Serializable) mUsers); 
data.putInt("current_class", mCurrentClassId); 
data.putInt("current_user", mCurrentUserId); 

Intent intent = new Intent(ctx, ChildActivity.class); 
intent.putExtras(data); 
ctx.startActivityForResult(intent, 0); 

Ecco mUsers è un elenco di HashMap<String,String> con i dati degli utenti, tra cui codifica Base64 foto, somma delle stringhe dimensioni in questo lista è di circa 500Kb

Chiama a startActivityForResult si blocca per diversi minuti con lo schermo nero e quindi ottengo errore ANR. Il sotto-attività onCreate non viene chiamato affatto.

Se non aggiungo stringhe grandi a mUser (nessuna foto con codifica Base64) - funziona perfettamente.

prega di aiuto.

+0

Provare ad usare Parcelable. http://stackoverflow.com/questions/2139134/how-to-send-an-object-from-one-android-activity-to-another-using-intents – DunClickMeBro

+0

Hai provato a eseguire il threading dell'intento con 'java.lang. Runnable'? –

+1

Forse ti sarebbe servito meglio mettendo questo 'ArrayList' in un Singleton, sarai in grado di accedervi da ogni' Activity' nella tua applicazione. –

risposta

7

se entrambe le attività sono tue, utilizzare un modello di dati decente. Android non incoraggia molto a un'applicazione molto ben progettata. O giralo in modo diverso, ti permette un'applicazione veloce sviluppata e non promuove gran parte del buon principio di applicazione del software.

La soluzione di @ Jean-Philippe Roy (québec?) È interessante ma singleton è piuttosto un anti-modello quando si tratta di cose più elaborate, vale a dire modelli di stato o servizi.

L'opzione migliore è utilizzare una classe di applicazione. Questa classe è il tuo singleton, per natura in Android. Così,

  • definiscono una classe di applicazione nel vostro manifesto
  • fornire un metodo statico per accedere all'istanza unica della classe di applicazione (è sempre un singleton).
  • dargli un metodo per ricevere e contenere i dati, chiamare dal proprio prima attività
  • e un secondo per farli tornare nella vostra seconda attività

--- aggiornato dopo @ di straya risposta e 18 mesi in più di programmazione Android :)

La questione della condivisione di una struttura dati o di processi su applicazioni, attività, viste, frammenti è sempre presente quando si costruisce un'applicazione Android. E 'importante conoscere e considerare che l'ambito di applicazione è il posto giusto per tenere struttura condivisa, ma utilizzando la classe applicazione stessa a mettere una struttura di dati in tale ambito non è praticabile per quanto riguarda:

  • qualità del codice, se tutte le strutture di dati condivisi e il processo sono a conoscenza dell'applicazione, diventerà rapidamente gonfio di accessorie per tutte quelle entità.
  • c'è solo una piscina globale condivisa di entità, che non è trovare abbastanza grana e può portare a difficili da individuare modi di entità di accoppiamento

ora tendono a preferire usando Dependency Injection singletons gestiti. Sia Dagger sia RoboGuice consentono di creare e iniettare una singola istanza di una determinata classe in altre classi. Questa tecnica, e più in generale DI offre grandi possibilità per un buon design Android:

  • non degradano la qualità del codice, è anche accorciato un bel po '. Usa @Inject per iniettare dipendenze e verranno iniettate.
  • non attribuire 2 responsabilità alla classe singletoned: non gestirà la creazione dell'istanza singleton, il framework lo farà.
  • è più semplice passare da un singleton a un'istanza normale
  • poiché questi singleton diventano normali classi con una semplice annotazione, non contengono più metodi statici e questo consente di prenderli in giro molto facilmente. E questo è un grande punto.
  • e, naturalmente, le annotazioni DI rendono molto chiaro quando una classe dipende da un'altra classe, contribuendo maggiormente al codice di autocertificazione.
+0

Grazie, Snicolas, Jean-Phillipe. Ho temporaneamente implementato questo come singleton separato, ma userò sicuramente la classe dell'applicazione. – Tiger

+1

Questa soluzione avrà esito negativo al riavvio del processo dell'applicazione e dopo il ripristino di un'attività che tenta di leggere i dati da dentro (più comunemente, nel metodo onCreate) –

+0

@SargeBorsch il 'onSaveInstanceState()' può salvare in tal caso! –

0

Proprio in risposta a Snicolas' risposta:

applicazione è già un Singleton, non c'è bisogno di "girarla su" uno.

Personalmente, dopo un po 'di serio affidamento su Application per conservare i dati per un lungo periodo, sono giunto a non fidarmi del tutto. Io uso gli oggetti dati di auto-memorizzazione nella cache per mitigare i problemi;)

+0

Aggiornato, grazie. Sarei completamente d'accordo con te adesso. Penso che sia ancora bene considerare che l'applicazione è lo scopo giusto per definire un singleton. Potrebbe non essere appropriato utilizzare la classe dell'applicazione per collegarli all'ambito dell'applicazione. Ora preferisco 2 modelli, uno di loro come descrivi. Aggiornerò la mia soluzione per parlarne. Vi invito a commentare di nuovo se ne avete voglia. – Snicolas

+0

Ciao straya, puoi fornire qualche motivo per non fidarti della classe Application per conservare i dati? –

+1

@MuhammadBabar perché l'applicazione può essere ricreata in qualsiasi momento (teoricamente a causa della memoria insufficiente) dal sistema operativo e non sarà sempre possibile vedere le chiamate Application.onTerminate() o Application.onLowMemory(). http://stackoverflow.com/questions/12672584/android-app-application-singleton-instance-gets-recreated – straya

Problemi correlati