Farò del mio meglio per descrivere il problema, ma sono ancora molto nuovo rispetto a diversi concetti che ritengo che questo problema richieda di essere risolto (ovvero interfacce e thread). Dovrei dare una premessa dicendo che ovviamente non sono un Comp Sci major (come vedrai). Ho imparato come ho costruito la mia app, quindi la mia teoria è terribile.
La mia app funziona come segue: Ho un oggetto di allenamento che è contenuto in un'attività, che contiene anche alcuni frammenti dell'interfaccia utente. I frammenti dell'interfaccia utente accettano l'input dell'utente, quindi chiamano i metodi nell'attività, che quindi manipolano l'oggetto.
Dopo che l'utente ha terminato di inserire i propri dettagli, l'oggetto Workout (che è una HashMap), viene serializzato e passato alla successiva attività tramite Bundle, quindi deserializzato. Questo generalmente perde l'ordine in cui l'utente aggiunge esercizi all'Oggetto di Allenamento, che è importante mantenere. Anche l'uso di LinkedHashMap non funziona, dato che è bugged quando si tratta di serializzazione (deserializza come normale HashMap, verificata con Eclipse debugger). L'intero processo si ripresenta quando l'utente desidera salvare l'allenamento, in quanto l'allenamento viene nuovamente associato e passato a un frammento. In altre parole, l'Oggetto viene archiviato, manipolato e consultato, nello stesso posto in cui gestisco gli eventi di input dell'utente. Questo mi sembra una pratica terribile.
Ecco cosa dovrei fare:
Avere un frammento, che contiene l'oggetto di allenamento ed eseguito in background. Sarebbe anche accessibile da ogni attività che richiede l'oggetto Workout e comunicherà con i frammenti e le attività tramite l'interfaccia, come segue:
[Background Fragment]
/ \
/ \
(Activity 1) (Activity 2)
/ \ / \
[UI Frag] [UI Frag] [UI Frag] [UI Frag]
Questo risolve il problema di dover passare l'oggetto Workout in giro come l'unico Joint in un concerto di Ziggi Marley, e l'unica volta che deve essere serializzato è quando viene chiamato onSaveInstanceState()
, se non sbaglio. Questo mi sembra una pratica migliore.
Sembra un approccio ragionevole per il flusso di dati della mia app?
Anche se ogni dettaglio in più che mi puoi dare mi farà risparmiare un sacco di tempo, un Sì o un No seguito da un breve Perché sarebbe sicuramente d'aiuto.
Questa è più una domanda bonus, poiché sono pienamente disposto a risolvere questo problema attraverso il metodo della forza bruta, (prova le cose fino a quando qualcosa non funziona), ma:
Vista l'inclinazione di Android nell'uccidere i processi in background, quale implementazione avrebbe funzionato meglio per mantenere e manipolare il frammento di sfondo proposto?
Ho la sensazione che avere questo frammento in esecuzione su un thread separato possa essere una buona idea, ma di loro non ne so ancora molto. Di nuovo, questo frammento deve essere accessibile da più di una attività, praticamente in qualsiasi momento.