2011-01-29 7 views
9

In uno scenario in cui ho un'interfaccia utente che verrà aggiornato da un thread separato (usando AsyncTask), posso definire l'AsyncTask come una classe interna delle attività, ma questo ha due aspetti negativi che trovo problematico:Come modificare l'UI delle attività da un AsyncTask Android?

  1. rende i file di origine molto grande, riducendo l'efficienza nella gestione del codice di
  2. lo rende difficile riutilizzare la classe thread

che cosa è una buona soluzione? Utilizzare una classe interiore, ma astrarre tutto ciò che fa ad altre classi? Passa un riferimento all'Attività su AsyncTask? Definisci sempre la classe AsyncTask come una classe interna e accetti semplicemente che i file sorgente saranno grandi?

risposta

2

Un bel po 'di esempi ho visto passare un Context nel costruttore del AsyncTask.

public class BackgroundStuff extends AsyncTask<Void, Void, Void> { 
    ... 
    Context mContext; 
    ... 
    BackgroundStuff(Context context){ 
     super(); 
     this.mContext = context; 
    } 
    ... 
} 

Sarei interessato a sapere se qualcun altro utilizza altri approcci.

+0

Passare un contesto alla classe è ciò che faccio attualmente, sembra piuttosto complicato, ma forse non c'è un modo migliore. –

13

Prima di tutto: quando si utilizza un AsyncTask non si deve eseguire attività UI entro doInBackground().

Quello che puoi fare è - se vuoi, ad es. lo stato di aggiornamento per un lavoro in background con esecuzione prolungata, è publishProgress(values) da doInBackground(). Il runtime, quindi, per quei valori chiama il callback onProgressUpdate(values), che viene eseguito nel thread dell'interfaccia utente e da cui è possibile aggiornare l'interfaccia utente.

Dai un'occhiata ad es. https://github.com/pilhuhn/ZwitscherA/blob/master/src/de/bsd/zwitscher/TweetListActivity.java#L336 per vedere un esempio.

AsyncTask può essere implementato in un proprio file di classe.

+0

Il metodo doInBackground() non può accedere all'interfaccia utente, il framework genera un'eccezione se tenta. Ma la mia domanda riguarda più come la sottoclasse AsyncTask effettivamente accede all'interfaccia utente. –

+0

@Olli questo è quello che dico: doInBackgrround() non deve accedere all'interfaccia utente. O farlo prima o dopo con onPre | PostExecute() o in mezzo pubblicando il progresso. Quei tre metodi di callback sono autorizzati ad accedere all'UI –

0

Ho un POV un po 'strano con AsyncTasks perché generalmente preferisco usare thread normali, ma essenzialmente il modo in cui eseguo un'attività in background e aggiornare un'interfaccia utente è creare un gestore alla fine del metodo onCreate(), lo farò quindi sovrascrivere il metodo handleMessage (Message msg).

Quindi nel mio thread, passerò il gestore come parametro, quindi quando desidero fare un aggiornamento invierò un messaggio dal thread al gestore, ora ciò che fa è comunicare dal nuovo thread in background sul thread dell'interfaccia utente per elaborare il lavoro sull'interfaccia utente.

Ora immagino che AsyncTasks esegua un'attività simile ma rimuove la necessità di implementare l'override del metodo handleMessage del Gestore.

Sarebbe interessante imparare di più su eventuali vantaggi/svantaggi tra questi due approcci.

+0

Inizialmente utilizzato Handler, ma non mi sono mai adattato, anche se questa è una percezione del tutto soggettiva.Mi piace la chiarezza di AsyncTask e di solito li suddivido in classi separate (piuttosto che in una classe interna) che mi aiuta a lavorare con esso, e mantengo la sottoclasse Activity più gestibile. –

Problemi correlati