2013-07-11 4 views
5

Come restituire un elenco generato in un AsyncTask all'attività?AsyncTask restituisce l'elenco all'attività

classe mia LoadStringsAsync:

public class LoadStringsAsync extends AsyncTask<Void, Void, List<String> > { 

    List<String> str; 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     ... 
    } 

    @Override 
    protected List<String> doInBackground(Void... arg0) { 
     ... 
     get content from the internet 
     and 
     fill the list 
     ... 
    } 

    @Override 
    protected void onPostExecute(List<String> str) { 
     super.onPostExecute(events); 
     ... 

    } 
} 

e ho bisogno l'elenco indietro nella mia attività per lavorare con esso. (No non solo per mostrarlo in ListView: P)

Qualche suggerimento su come fare? :-)

Grazie mille!

+0

http://stackoverflow.com/questions/17398837/processdialog-is-not-appearing-properly. controllare questo in questo caso si restituisce una stringa. modificare di conseguenza – Raghunandan

+0

Probabilmente dipende da cosa si vuole fare con la Lista. Puoi fornirci maggiori informazioni? – Enrichman

risposta

7

tua Attività:

public class YourActivity extends Activity { 
    private List<String> list = new ArrayList<String>(); 

    public void onCreate(Bundle state) { 
     //... 
    } 

    public void setList(List<String> list) { 
     this.list = list; 
    } 

    private void fireYourAsyncTask() { 
     new LoadStringsAsync(this).execute(); 
    } 

}  

AsyncTask:

public class LoadStringsAsync extends AsyncTask<Void, Void, List<String>> { 

    List<String> str; 
    private YourAcitivity activity; 

    public LoadStringsAsync(YourAcitivity activity) { 
     this.activity = activity; 
    } 

    @Override 
    protected List<String> doInBackground(Void... arg0) { 
    } 

    @Override 
    protected void onPostExecute(List<String> str) { 
     super.onPostExecute(events); 
     activity.setList(str); 
    } 
} 
+0

Funziona perfettamente! ...... non ha capito l'idea: D :) – Heisnberg

+0

non è stato in grado di risolvere il simbolo "eventi" –

+0

La variabile "eventi" è nella domanda dell'op. Usa la tua variabile. – wtsang02

0

Inserisci codice che utilizza l'elenco o lo imposta su una variabile all'interno di onPostExecute().

meglio eseguire il compito da Activity genitore come:

public class MyActivity extends Activity{ 
    private List<String> mData = new ArrayList<String>(); 


    private void runTask(){ 
    new LoadStringsAsync(){ 

     @Override 
     protected void onPostExecute(List<String> str) { 
     super.onPostExecute(events); 
     mData.clear(); 
     mData.addAll(str); 
     } 

    }.execute(); 
    } 
} 
1

Se fate la vostra AsyncTask una classe interna nella vostra attività, allora OnPostExecute sarà nello stesso contesto come l'attività, ed è possibile utilizzare l'elenco come faresti ovunque nell'Attività.

Se non si attiva AsyncTask in classe interna nell'attività, è necessario impostare un listener per richiamare l'attività quando termina l'AsyncTask. Se preferisci seguire questa strada, consulta this post.

C'è anche this post che è simile alla tua domanda.

+4

Non è chiamato sottoclasse. La formulazione dovrebbe essere. "Implementare AsyncTask come una classe di produzione interna nella propria attività". – wtsang02

+0

Sei corretto, l'ho cambiato. – yiati

0

In base alla documentazione di Android link è possibile utilizzare il metodo get per restituire il risultato computazionale. Dal momento che l'AsyncTask mostra che si restituisce un elenco, allora si può provare il seguente codice nella classe che si sta chiamando la classe asincrono

List<String> returnedlist=new LoadStringAsync().execute().get(); 

Sperando questa opzione aiuta.