Istanza di classe mantenendo le variabili tra le attività

0

Primo: questo è per un progetto già distribuito e richiede una soluzione che non "riscriva il modo in cui tutto funziona"!

Ho una sorta di "dettaglio record" che memorizza il RecordID corrispondente in una variabile statica. All'interno di questa schermata è possibile eseguire il drill down, che passa il RecordID in un bundle e viene recuperato dalla nuova attività per visualizzare e modificare le informazioni in modo appropriato. Tornare alla schermata dei dettagli originali funziona come previsto.

Ora devo incorporare una funzionalità che utilizza una nuova istanza di questa stessa schermata di dettaglio; ma se creo una nuova istanza di questa attività di dettaglio e passaggio sul RecordID e quindi tornare alla prima istanza della schermata dei dettagli, che RecordID è ora uguale a quello che ho passato al secondo istanza. Ciò è dovuto al fatto che RecordID è statico, suppongo.

Quando faccio questo RecordID non più statico, posso creare liberamente una nuova istanza della classe detail e andare avanti e indietro con i RecordID corretti in ogni istanza. Tuttavia ... questo lo rende così quando esegui il drill down in un'attività all'interno dei dettagli e ritorna, le variabili ora sono nulle.

Qual è il modo migliore per risolvere questa situazione?

  • Non penso che l'utilizzo di savedInstanceState possa funzionare poiché l'attività non verrà effettivamente distrutta. Ho provato questo e il metodo non è nemmeno chiamato.
  • Ho pensato di fare startActivityForResult e di passare l'ID del record alla schermata dei dettagli, ma mi sembra orribile inefficiente.
posta Rein S 26.08.2016 - 15:36
fonte

2 risposte

1

Hai ragione nel ritenere che essere statici stia causando il problema. Oltre a prevenire il riferimento statico alla creazione di una seconda istanza significa che non esiste un'istanza reale, basta fare riferimento alla classe stessa. Il motivo per cui ottieni dei valori null quando esci è perché non hai un riferimento all'oggetto sopra di te.

Pensa ad esso come un albero di navigazione. Se inizi su una foglia e vai al genitore del genitore del genitore, arrivi ad un punto in cui non ricordi la via del ritorno e ci sono diverse possibilità. È necessario memorizzare i riferimenti lungo la catena. Vorrei usare una pila per contenere i riferimenti man mano che ci si sposta più a fondo. Quindi quando torni su, puoi semplicemente far uscire il nodo dallo stack.

    
risposta data 26.08.2016 - 18:01
fonte
1

Le variabili globali (cioè static ) sono considerate malvagie in generale , ma che raddoppiano su Android a causa di come il framework gestisce i processi. Il problema che hai descritto è un esempio della loro cattiveria generale. Diventa più strano se l'app va in background e il processo viene distrutto. In questo caso, la stessa attività (concettualmente ... in realtà un'istanza diversa) troverà la tua static variabile null, anche se non l'hai mai allontanata. E diventa ancora più strano se si "esce" dall'app e il framework decide di mantenere il processo. In tal caso, la tua app vedrà il vecchio valore al successivo avvio.

startActivityForResult / onActivityResult è il modo preferito per passare i valori su e giù per lo stack di attività. Non è più inefficiente di qualsiasi altra cosa in Android, e non è come succede migliaia di volte in un ciclo o qualcosa del genere.

    
risposta data 26.08.2016 - 21:55
fonte

Leggi altre domande sui tag