2012-05-13 23 views
9

Nell'evento onCreate() di un'attività, ho avviato un AsyncTask per recuperare i dati del prodotto da un database. Dopo che questo è stato completato con successo, come posso aggiornare il display?AsyncTask - dopo l'esecuzione, come aggiornare la vista?

Metacode:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.venueviewbasic); 
      (..) 
    new GetProductDetails().execute(); 

class GetProductDetails extends AsyncTask<String, String, String> { 

    protected String doInBackground(String... params) { 

     // updating UI from Background Thread 
     runOnUiThread(new Runnable() { 
      public void run() { 
       // Check for success tag 
       int success; 
       try { 
        // Building Parameters 
        List<NameValuePair> params = new ArrayList<NameValuePair>(); 
        params.add(new BasicNameValuePair("id", vid)); 
     (.. retrieve and parse data and set new textview contents ..) 

Le textviews ecc non si aggiorna comunque.

risposta

15

Se si desidera aggiornare la vista dalla asincrona dopo il processo completo in poi è possibile utilizzare

protected void onPostExecute(String result) 
    { 
     textView.setText(result); 
    } 

Ma se si desidera aggiornare i dati mentre si esegue il processo in background, utilizzare. Per ex ...

protected Long doInBackground(URL... urls) { 
     int count = urls.length; 
     long totalSize = 0; 
     for (int i = 0; i < count; i++) { 
      totalSize += Downloader.downloadFile(urls[i]); 
      publishProgress((int) ((i/(float) count) * 100));<------ 
     } 
     return totalSize; 
    } 

    protected void onProgressUpdate(Integer... progress) { <------- 
     setProgressPercent(progress[0]); 
    } 

per maggiori dettagli vedi this link Spero che questo vi aiuterà a ...!

+0

fantastico, lo considererò per aggiornare la mia listview piuttosto lunga da qualche altra parte, per ora la prima parte ha fatto il trucco. Grazie! :) – richey

+0

siete sempre i benvenuti @richey ... – MAC

+1

Ottiene 'myTextView non può essere risolto' se provo' myTextView.setText (result); '. E ottengo 'Il metodo findViewById (int) non è definito per il tipo MyClass' se provo a caricare l'interfaccia utente. –

5

Nella classe AsyncTask, aggiungere un metodo onPostExecute. Questo metodo viene eseguito sul thread dell'interfaccia utente e può aggiornare qualsiasi componente dell'interfaccia utente.

 
class GetProductDetails extends AsyncTask<...> 
{ 
    ... 
    private TextView textView; 
    ... 
    protected void onPostExecute(String result) 
    { 
     textView.setText(result); 
    } 
} 

(Il parametro result è il valore restituito dal metodo della classe doInBackground.)

+0

esattamente, questo ha fatto il trucco, grazie !! Devo aggiornare la visualizzazione nel metodo onPostExecute() piuttosto che direttamente nella discussione. – richey

+0

Non riesco a risolvere 'myTextView' se provo' myTextView.setText (result); '. E ottengo 'Il metodo findViewById (int) non è definito per il tipo MyClass' se provo a caricare l'interfaccia utente. –

+0

Hai ricevuto la tua risposta @FranciscoCorralesMorales. Sto ottenendo lo stesso problema – Yasha

7

Sto indovinando che la domanda riguarda più come ottenere la vista dell'interfaccia utente se asyncTask si trova in un file separato.

In tal caso, è necessario passare il contesto all'attività Async e utilizzarlo per ottenere la vista.

class MyAsyncTask extends AsyncTask<URL, Integer, Long> { 

    Activity mActivity; 

    public MyAsyncTask(Activity activity) { 
     mActivity = ativity; 
    } 

E poi nel vostro OnPostExecute utilizzare

int id = mActivity.findViewById(...); 

Ricordate non è possibile aggiornare la vista da "doInBackground" dal momento che la sua non è thread dell'interfaccia utente.

Problemi correlati