2012-05-13 17 views
9

En el evento onCreate() de una actividad, he iniciado una AsyncTask para recuperar datos del producto de una base de datos. Después de que esto se haya completado con éxito, ¿cómo puedo actualizar la pantalla?AsyncTask: después de la ejecución, ¿cómo actualizar 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 ..) 

Los textviews etc., no se deje sin embargo actualiza.

Respuesta

15

Si desea actualizar la vista desde asíncrono, tras un proceso completo en continuación puede utilizar

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

Pero si desea actualizar los datos mientras ejecuta el proceso en segundo plano, utilice. Para 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]); 
    } 

para más detalles, véase this link Hope esto le ayudará a ...!

+0

genial, consideraré eso para actualizar mi larga lista en otro sitio, por ahora la primera parte hizo el truco. ¡Gracias! :) – richey

+0

eres siempre bienvenido @richey ... – MAC

+1

Me sale 'myTextView no se puede resolver' si intento' myTextView.setText (result); '. Y obtengo 'El método findViewById (int) no está definido para el tipo MyClass' si intento cargar la UI. –

5

En su clase AsyncTask, agregue un método onPostExecute. Este método se ejecuta en el hilo de la interfaz de usuario y puede actualizar cualquier componente de la interfaz de usuario.

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

(El parámetro result es el valor devuelto por el método de la clase doInBackground.)

+0

exactamente, eso funcionó, gracias! Tengo que actualizar la pantalla en el método onPostExecute() en lugar de hacerlo directamente en el hilo. – richey

+0

Me sale 'myTextView no se puede resolver' si intento' myTextView.setText (result); '. Y obtengo 'El método findViewById (int) no está definido para el tipo MyClass' si intento cargar la UI. –

+0

¿Recibió su respuesta @FranciscoCorralesMorales. Estoy recibiendo el mismo problema – Yasha

7

Supongo que la pregunta es más sobre cómo obtener la UI View si la asyncTask está en un archivo separado.

En ese caso, debe pasar el contexto a la tarea Async y usar eso para obtener la vista.

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

    Activity mActivity; 

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

Y luego, en su onPostExecute usar

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

recuerde que no puede actualizar la vista desde "doInBackground" ya que no es el hilo de interfaz de usuario.

Cuestiones relacionadas