2013-09-24 19 views
7

AsyncTask è progettato per essere una classe di supporto attorno a Thread e Handler e non costituisce un framework di threading generico. AsyncTasks dovrebbero idealmente essere utilizzati per operazioni di breve (pochi secondi al massimo.)Uso intensivo asynctask

Questo è quello che dice nella documentazione.

Lingua di rete parlante, quanto dura "pochi secondi"?

La mia app eseguirà quanto segue, otterrà un elenco di array da DB, lo invierà al server, otterrà un altro elenco (json), invierà un ok che ha ricevuto l'elenco, analizza i jsons, inserisce l'elenco all'interno di db, do alcuni altri processi nel db, aggiornano l'interfaccia utente .. (l'elenco può raggiungere 5000-1000 voci di istanze di oggetto)

L'utilizzo di asynctask per tali materiali è una buona idea? Devo anche aggiornare la GUI in base ai risultati della risposta dal server.

Se no, quali altre alternative ho?

+1

IntentService forse? – gunar

+0

alcuni sono raramente più di un ordine di grandezza. ciò che descrivi sembra abbastanza lungo, il che significa che gli utenti usciranno dall'attività e si aspetteranno che il trattamento finisca in background.un asynctask non sembra appropriato qui. Io +1 gunar e raccomando e IntentService – njzk2

+0

che diamine "pochi è raramente più di un ordine di grandezza" significa compagno? questo sarà fatto in silenzio sullo sfondo e gli utenti non lasceranno l'app .. @ njzk2 – tony9099

risposta

4

Ho già fatto qualcosa di simile a te. Ho scaricato un mucchio di immagini (circa 5000), l'ho salvato nella scheda SD e salvato una riga in un database. Ho usato Async Task senza problemi e non vedo alcun problema nell'usarlo. Vi consiglio di utilizzare una barra di avanzamento per mostrare all'utente ciò che l'applicazione sta facendo e con la possibilità di annullare l'operazione (AsyncTask fornisce un meccanismo di cancellazione)

+1

okay @ ACDias, sembra promettente, quindi per quanto posso dire, asynctask può gestire il lavoro che eseguirò, perché il mio sarebbe solo testo piuttosto immagini. – tony9099

+0

+1 per il consiglio di progressBar. – HoodVinci

3

Vai a questa risposta: AsyncTask for long running operations

In sintesi, a lungo eseguire AsyncTasks può creare perdite di memoria a causa della sua implementazione. Può anche causare problemi con i cambiamenti di orientamento.

1

Questo è quello che capisco. Infatti AsyncTask è principalmente correlato con l'interfaccia utente. Ad esempio, OnPostExecute viene eseguito nel thread dell'interfaccia utente.

Quindi, a mio avviso, è possibile utilizzare AsyncTask in modo sicuro, se l'utente può ragionevolmente attendere la fine dell'operazione.

Il modo migliore per sapere se il tuo compito soddisfa le condizioni, è di provare.

0

Per quanto riguarda Orientamento dello schermo:

Dopo aver letto le risposte in questa pagina, ho capito che la mia app non poteva gestire i cambiamenti di orientamento durante l'esecuzione AsyncTask.

Qui è la mia soluzione a questo problema:

@Override 
protected void onPreExecute() { 
    Device.lockOrientation((Activity)context); 
    ... 
} 

@Override 
protected void onPostExecute(List<Hydrant> hydrants) { 
    Device.releaseOrientation((Activity)context); 
    ... 
} 

L'implementazione di dispositivo:

public class Device { 

    public static void lockOrientation(Activity activity) { 
     Display display = ((WindowManager) activity.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); 
     int rotation = display.getRotation(); 
     int tempOrientation = activity.getResources().getConfiguration().orientation; 
     int orientation = 0; 
     switch(tempOrientation) 
     { 
     case Configuration.ORIENTATION_LANDSCAPE: 
      if(rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_90) 
       orientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE; 
      else 
       orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE; 
      break; 
     case Configuration.ORIENTATION_PORTRAIT: 
      if(rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_270) 
       orientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; 
      else 
       orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT; 
     } 
     activity.setRequestedOrientation(orientation); 
    } 

    public static void releaseOrientation(Activity activity) { 
     activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED); 
    } 

} 

Come AsyncTasks servono solo a correre per qualche secondo, si tratta di una soluzione accettabile per me come questo raramente interesserà un utente. Soprattutto con qualcosa come un ProgressDialog che fornisce una buona indicazione di quanto tempo dovrà aspettare.