2012-03-02 12 views
5

In passato, le modifiche di orientamento e AsyncTask (e altre attività in background di lunga esecuzione) non si sono svolte bene l'una con l'altra. C'è sempre stato il problema di sapere quali attività (o thread) sono ancora in esecuzione nell'attività appena creata (da un cambiamento di orientamento) e cosa fare quando un'attività termina mentre un'attività non è collegata.Android, AsyncTask, processi in esecuzione prolungata e modifiche di orientamento

Anche con Fragments e LoaderManager, questo sembra essere un problema per me.

Qual è il metodo preferito in questi giorni, per gestire attività a lungo termine e cambi di orientamento arbitrari? Per sapere quali attività sono in esecuzione nell'attività appena creata. Per assicurarsi che un'attività non provi a fornire le sue informazioni quando un'attività non è allegata.

Grazie

+2

Suggerisco di riscrivere la domanda, sostituendo la parola "processo" in luoghi in cui non si intende realmente "processo" ma invece si intende qualcos'altro. Un processo OS ha una definizione molto specifica, che fa sì che la tua domanda abbia poco senso (ad esempio, i processi non forniscono informazioni, le attività non creano processi). – CommonsWare

risposta

4

Nel mio programma ho appena messo

android:configChanges="orientation|keyboardHidden|keyboard" 

nelle mie attività nel manifesto e da fare con esso. Dopo 1 anno ho avuto 0 problemi.

+0

Come procedete nel gestire la configurazione? – synic

+0

Ho scoperto che avere questo nel manifest fa sì che l'attività non venga ricreata, risolvendo così tutti i tuoi problemi. Stavo andando a occuparmene da solo, ma in pratica non l'ho trovato necessario. Funziona come ti aspetteresti/vorresti. – Pyrodante

+0

Wow. Mi sono sempre allontanato da questo perché mi sembrava più complicato di quanto volessi. Hai ragione, sembra funzionare come lo voglio. – synic

-1

È lo stesso di sempre: utilizzare un servizio. Trasmetti eventi dal tuo servizio e catturali nella tua attività (o in un livello intermedio). La tua attività può quindi scegliere cosa fare con quegli eventi in base al suo stato.

Questa è una domanda piuttosto ampia.

+1

Non penso che questo sia il problema che i Servizi sono destinati a risolvere. Sembra che se la tua applicazione non ha attività indipendenti dal tuo ciclo di vita dell'Attività, un Servizio sarebbe solo uno spreco di risorse. – synic

0

Come altri post suggerisce, è possibile utilizzare android: configChanges = xxx.

MA, questo non è sempre desiderato. Android è progettato per eliminare l'attività sul cambiamento di configurazione e crearne uno nuovo, e in alcuni casi potresti trarne beneficio, fornendo una schermata alternativa. Questo ha senso, ad esempio, nell'applicazione a più riquadri, in cui l'orientamento orizzontale mostra visioni diverse rispetto all'orientamento verticale.

Quindi, per tornare alla domanda: non ho letto sul modo preferito di gestire le operazioni a lungo termine, ma dalle proprie esperienze suggerirei di memorizzare tale attività nello stato di attività persistente (salvato/ripristinato in onRetainNonConfigurationInstance/onCreate) , o usando frammenti persistenti.

Se la tua attività rileva che alcune attività sono già in esecuzione, può dargli la possibilità di ricreare la finestra di dialogo per mostrarne l'avanzamento.

E nota: il cambiamento dell'orientamento non è l'unico che può ricreare l'attività. Preparati per il cambio di lingua, l'attracco e altre possibilità :) Ma ancora, il cambiamento di orientamento è il più comune.

+0

Persistent Fragments ha ancora la possibilità di provare a fornire risultati quando l'attività non è allegata. onRetainNonConfigurationInstance non può memorizzare, ad esempio, una connessione di rete attiva. Il problema qui non è lo stato di archiviazione per la modifica della configurazione, è assicurarsi che i dati non vengano consegnati quando un'attività non è collegata, o assicurarsi che non provi a consegnarla a un'attività morta – synic

Problemi correlati