2012-01-11 8 views
14

Ho un'applicazione che utilizza AsyncTasks per effettuare chiamate a un server REST.Quando l'app passa allo sfondo durante un'esecuzione AsyncTask, cosa dovrebbe fare?

Immaginate che durante un periodo di caricamento (questo è AsyncTask che va al server REST e porta i dati alla schermata successiva) l'utente preme Home.

ciò che è raccomandato:

  • Annullare l'AsyncTask corrente (s) e riavviare quando si riprende l'attività

o

  • continuare l'AsyncTasks ma evitando la startActivity controllando se l'app è in background (per evitare il primo piano della nuova attività dopo aver inviato l'app allo sfondo). E onResume invio alla prossima attività

scenari peggiori che si dovrebbe prevedere:

  1. L'applicazione va in background e viene ucciso a causa della mancanza di memoria
  2. L'AsyncTask fallisce a causa di timeout o altro errore REST

Dopo che entrambi, l'utente torna al app ...

+0

dipende dal vostro requisito.
Se vuoi chiedere come fare uno dei due modi che hai menzionato, è un caso diverso.
Indica se è quello che ti serviva. – akkilis

+0

No, so come implementare. Voglio sapere se comunque i due sono più consigliati e perché. Quali sono i problemi e i vantaggi di ciascuno. – neteinstein

+0

Come ho detto, dipende dalle vostre esigenze. 1. Si accerterà che non venga intrapresa alcuna azione dopo che l'attività è stata messa in pausa e si assicura che vengano neutralizzate alcune eccezioni comuni sollevate in tali casi. 2. Richiederà un po 'più di attenzione nel codice e manterrà la variabile di stato ed è più sofisticato in termini di esperienza. Ma hai il problema di aumentare le eccezioni/o l'incongruenza nel caso in cui Android abbia rimosso la tua attività dallo stack delle attività. In tal caso il thread verrà caricato nuovamente nonostante sia stato eseguito in passato perché l'istanza precedente è stata cancellata da Android. – akkilis

risposta

6

Beh io ll consiglio di servizio che dovrebbe utilizzare AsyncTask per fare il suo lavoro. Il servizio isolerà la tua attività dal cambiamento di orientamento o dall'uscita dell'utente. AsycnTask isolerà dal thread dell'interfaccia utente bloccato. Ma assicurati di uscire dal servizio quando hai finito con REST API.

Questo vi darà il meglio di entrambi. Inoltre, se non si utilizza DB come cache locale, è possibile provare anche questo. Quindi, anche se l'utente va via, il servizio memorizzerà i dati recuperati nel DB e quando l'utente torna può visualizzare rapidamente lo schermo.

MODIFICA: solo aggiungere IntentService è facile da implementare.

Prova Design Patterns for REST clients on Android by Google per spiegazione più esaustiva

0

scaricano continua così come l'app Android Market, ma mostra una notifica con l'opzione di annullare. Puoi implementarlo utilizzando un servizio da scaricare.

+1

Non sto scaricando una "app" o qualcosa di specifico come il mercato. Non credo proprio che questa sia una soluzione user-friendly ... – neteinstein

+0

questo è solo un esempio della grande maneggevolezza che utilizza Android Market per scaricare contenuti. Se stai scaricando una piccola serie di dati, la prima alternativa è corretta. Se stai scaricando un grande volume di dati, devi imitare l'app di Android Market. –

3

L'utilizzo di AsyncTasks può diventare molto complicato durante una modifica della configurazione. Per esperienza personale, raccomanderei invece di percorrere il percorso IntentService/ResultReceiver.

Vedi questo post per ulteriori informazioni:

Restful API service

+0

Durante la rotazione non c'è problema in quanto ho effettivamente un riferimento all'attività, non appena viene creata la nuova attività la sostituisco con quella nuova. – neteinstein

+1

Indipendentemente da ciò, la route IntentService è ancora un modo più robusto per andare – SeanPONeil

1

Credo che quello che si vuole sapere è quale strada è meglio dal punto di vista degli utenti. Dalla mia esperienza, un utente si aspetta che l'app continui il download in background, perché se preme a casa, normalmente vuole controllare alcune altre app o lo ha premuto involontariamente e vuole tornare nella tua app non appena possibile. Se un utente desidera annullare il download, preme normalmente il pulsante Indietro o un pulsante specifico per annullare ciò che si trova da qualche parte sullo schermo della tua app.Pertanto, poiché l'utente desidera continuare a utilizzare l'app, il comportamento più conveniente della tua app è quello di continuare a scaricare i dati e, auspicabilmente, visualizzare i dati scaricati all'utente quando torna nella tua app.

Dal punto di vista tecnico, non utilizzerei un servizio. Vorrei lasciare in esecuzione AsyncTask. E nel peggiore dei casi in cui l'app viene uccisa tra di loro, l'app entra automaticamente nell'attività di partenza quando l'utente torna all'app, perché l'app viene riavviata comunque. Nel caso in cui l'asynctask non riesca, è possibile verificare se i dati sono stati scaricati correttamente e se non mostrano l'attività di avvio. Si può facilmente implementare questo con l'archiviazione dei dati scaricati in una variabile il cui valore iniziale è nullo. Se la variabile è ancora nullo dopo il download, AsyncTask non è riuscito e devi andare nell'attività di partenza. Penso che questa sia un'implementazione abbastanza solida.

+0

Stavo cercando entrambi. Grazie :-) – neteinstein

Problemi correlati