2013-03-26 14 views
11

Ho un problema concettuale relativo alla classe AsyncTask. Utilizziamo AsyncTask in modo che l'interfaccia utente principale non sia bloccata. Ma supponiamo, voglio recuperare alcuni dati dalla memoria del dispositivo, e io uso la classe AsyncTask per questo. La linea dedicata del codice sarà come segue (assumendo il tipo di dati restituito è String):Restituzione di dati da AsyncTask senza bloccare l'interfaccia utente

//code 
    String data = new ExtendedAsyncTask().execute(param1, param2).get(); 
    //use this returned value. 

non disposta la linea sopra bloccare l'interfaccia utente, sconfiggere lo scopo di utilizzare il AsyncTask? Se sì, come posso ottenere i dati rilevanti senza bloccare l'interfaccia utente? Vorrei aggiungere che la prossima riga di codice avrà bisogno di questi dati per eseguire alcune attività, e quindi dipende dal valore restituito.

Grazie

+0

AsyncTask spiegato da google: https://developer.android.com/guide/components/processes-and-threads.html#AsyncTask –

risposta

17

get() method will block the UI thread. Per ottenere i dati relavent è necessario restituire il valore da doInBackground e acquisire il valore nel parametro onPostExecute.

valore restituito da doInBackground viene catturato dal metodo OnPostExecute

Esempio:

public class BackgroundTask extends AsyncTask<String, Integer, String >{ 
     private ProgressDialog mProgressDialog; 
     int progress; 
     public BackgroundTask() { 
      mProgressDialog = new ProgressDialog(context); 
      mProgressDialog.setMax(100); 
      mProgressDialog.setProgress(0); 
    } 

     @Override 
    protected void onPreExecute() { 
      mProgressDialog =ProgressDialog.show(context, "", "Loading...",true,false); 
     super.onPreExecute(); 
    } 
    @Override 
    protected void onProgressUpdate(Integer... values) { 
    setProgress(values[0]); 
    } 

    @Override 
    protected String doInBackground(String... params) { 
      String data=getDatafromMemoryCard();  

     return data; // return data you want to use here 
    } 
    @Override 
    protected void onPostExecute(String result) { // result is data returned by doInBackground 
     Toast.makeText(context, result, Toast.LENGTH_LONG).show(); 
     mProgressDialog.dismiss(); 
     super.onPostExecute(result); 
    } 
    } 

Se si utilizza AsyncTask in classe separata, quindi utilizzare AsyncTask con l'interfaccia di callback così

Ecco la risposta che ho fornito in precedenza circa lo stesso AsyncTask with Callback

+0

Non voglio visualizzare quei dati, voglio usare quei dati. Ho ottenuto risultati simili al tuo quando ho cercato su Google il mio problema. – Rajat

+0

@addresseerajat Leggi la risposta completamente ..Le ultime due righe discutono su AsyncTask con callback, vai al link una volta – Pragnani

+0

Ok, ho qualche idea vaga, ma voglio che questi dati vengano passati al thread dell'interfaccia utente principale. – Rajat

0

Quando viene eseguita un'attività asincrona, il compito passa attraverso 4 fasi:

1.onPreExecute(), invoked on the UI thread before the task is executed. use this to diaply progress dialog. 

2.doInBackground(Params...), invoked on the background thread immediately after onPreExecute() finishes executing. Can also use publishProgress(Progress...) to publish one or more units of progress. These values are published on the UI thread, in the onProgressUpdate(Progress...) step. 

3.onProgressUpdate(Progress...), invoked on the UI thread after a call to publishProgress(Progress...). Used to publish progress. 

4.onPostExecute(Result), invoked on the UI thread after the background computation finishes. The result of the background computation is passed to this step as a parameter. 

Nella vostra attività onCreate()

TextView tv; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    tv= (TextView)findViewById(R.id.textView); 
    new TheTask().execute(); 

    } 
class TheTask extends AsyncTask<Void, Void,String> { 

    protected void onPreExecute() { 
    //dispaly progress dialog 
} 

protected String doInBackground(Void... params) { 
    //do network operation 
    return "hello"; 
} 

protected void onPostExecute(String result) { 
    //dismiss dialog. //set hello to textview 
     //use the returned value here. 
    tv.setText(result.toString()); 
} 
} 

considerare l'utilizzo di robospice (Un'alternativa a AsyncTask. https://github.com/octo-online/robospice.

Effettua chiamate asincrone, notifica sul thread ui.

Problemi correlati