2012-03-15 12 views
15

Sto utilizzando AsyncTask per caricare i dati nell'interfaccia utente. Ho scritto il codice per scaricare i dati dal server in un metodo separato e sto chiamando quel metodo da doinBackground. Darà un errore perché i metodi UI non possono accedere da doInBackground.but, voglio accedere. qualsiasi processo alternativo è lì per accedere al metodo dell'interfaccia utente da doinBackground.?Android: chiamata dei metodi sul thread UI dal metodo asyncTask doInBackground

risposta

47

qualsiasi processo alternativo è lì per accedere al metodo UI da doinBackground.?

Chiama publishProgress() in doInBackground(). Inserisci la tua logica di aggiornamento dell'interfaccia utente nello onProgressUpdate() del tuo AsyncTask. onProgressUpdate() verrà chiamato sul thread dell'applicazione principale (a.k.a., thread UI) dopo aver chiamato publishProgress(). Here is a sample project dimostrando questo.

+14

Il nome di CommonsWare è sufficiente. +1 –

+0

+1 per la risposta chiara –

+0

conosceva il metodo runOnUiThread(), ma mi è piaciuto l'altro approccioj di gestione di questo +1 – Deva

7

chiamata runOnUiThread (azione Runnable)

more here

+0

hi posso chiamare runOnUiThread() da doInBackground.? Funzionerà.? O come al solito mi può chiamare runOnUiThread da OnCreate stesso.? Qui ho un dubbio. RunOnUiThread bloccherà l'interfaccia utente, mentre caricamento dati.? –

+0

ha senso quando lo chiami da doInBackground() .. oppure non ha alcun significato .. – ngesh

+0

devi scrivere runOnUIThread dove aggiorni l'interfaccia utente principale. –

1

Come gli altri hanno sottolineato, è possibile utilizzare runOnUiThread. Ma sembra un po 'strano che tu voglia farlo nel tuo doInBackground. Se si desidera indicare l'avanzamento all'utente, è necessario gestirlo in AsyncTask.onProgressUpdate e chiamare publishProgress nel doInBackground.

Si può leggere di più su AsyncTask qui: http://developer.android.com/reference/android/os/AsyncTask.html

-Dan

1

Usa doInBackground() solo per le attività che:

  1. richiedere un certo tempo
  2. Non sono Ui legato

Quindi è possibile implementare AsyncTask.onPostExecute() per eseguire il codice per gestire tali risultati in thread UI principale da AsyncTask

Da JavaDoc per AsyncTask.onPostExecute():

"viene eseguito sul thread UI dopo doInBackground. ... "

Problemi correlati