2012-02-25 22 views

Respuesta

13

En opción es utilizar los oyentes, donde se crea una interfaz que sus implents actividad, algo así como:

public interface AsyncListener { 
    public void doStuff(MyObject obj); 
} 

De esta manera, si estás de subclases AsyncTask, es fácil añadir este oyente, a continuación, en onPostExecute(), usted podría hacer algo como:

protected void onPostExecute(MyObject obj) { 
    asyncListener.doStuff(obj); 
} 
6

Esto depende de la estructura de tu clase, pero si tu AsyncTask es una clase dentro de tu actividad, entonces puedes hacer referencia a los métodos de esa actividad. Lo que se puede hacer es en su método onPostExecute llamar a una función de la actividad que pasa algunos datos que se recuperaron en el AsyncTask a la actividad en la que a continuación se puede utilizar ..

El código se vería así

class YourActivity extends Activity { 
    private static final int DIALOG_LOADING = 1; 

    public void onCreate(Bundle savedState) { 
    setContentView(R.layout.yourlayout); 
    showDialog(DIALOG_LOADING);  
    new LongRunningTask1().execute(1,2,3); 

    } 

    protected Dialog onCreateDialog(int dialogId) { 
    switch(dialogId) { 
     case DIALOG_LOADING: 
      ProgressDialog pDialog = new ProgressDialog(this); 
      pDialog.setTitle("Loading Data"); 
      pDialog.setMessage("Loading Data, please wait..."); 
      return pDialog; 
     default: 
      return super.onCreateDialog(dialogId); 
     }  
    } 

    private void onBackgroundTaskDataObtained(List<String> results) { 
     dismissDialog(DIALOG_LOADING); 
    //do stuff with the results here.. 
    } 

    private class LongRunningTask extends AsyncTask<Long, Integer, List<String>> { 
     @Override 
     protected void onPreExecute() { 
      //do pre execute stuff 
     } 

     @Override 
     protected List<String> doInBackground(Long... params) { 
      List<String> myData = new ArrayList<String>(); 
      for (int i = 0; i < params.length; i++) { 
       try { 
        Thread.sleep(params[i] * 1000); 
        myData.add("Some Data" + i); 
       } catch(InterruptedException ex) { 
       }     
      } 
      return myData; 
     } 

     @Override 
     protected void onPostExecute(List<String> result) { 
      YourActivity.this.onBackgroundTaskDataObtained(result); 
     }  
    } 

} 

El flujo típico es así, configure la vista de la página actual y luego muestre un cuadro de diálogo de progreso. Inmediatamente después de que comience la tarea asincrónica (o cuando sea, realmente no importa).

Una vez completada su tarea de sincronización, llame a una función de la actividad y páselo. No use datos compartidos dentro de la tarea asíncrona o corre el riesgo de problemas con el subprocesamiento. En cambio, una vez que haya terminado, hágalo pasar a la actividad. Si desea actualizar la vista progresivamente mientras se hace el trabajo se puede utilizar en onProgressUpdate

+0

Gracias por su respuesta. No soy fanático de que AsyncTask se use como una subclase. Creo que deberías poder usar eventos. Creo que la respuesta es usar intenciones, pero esto solo creará una nueva instancia de mi actividad que no quiero. – skinnybrit51

+0

Puede usar fácilmente su AsyncTask en su propia clase, pero eso solo es útil si usa la misma lógica de múltiples actividades diferentes. En ese caso, podría: 1. usar una clase base común (no actividad, sino algo que se extienda) actividad) y luego tendría un método común que podría llamarse desde la tarea asincrónica. O mejor aún, pídales que implementen una interfaz común que tenga la devolución de llamada tal como lo describí. Pase una referencia a la actividad en el constructor de AsyncTask y asegúrese de que asyncTask tenga un constructor que tome un parámetro del tipo de interfaz. –

+0

Su última opción es abandonar AsyncTask por completo y poner esto en un servicio que necesita para crear un nuevo hilo para hacer la actividad de fondo (ya que los servicios no se ejecutarán en su propio hilo por defecto). Una manera fácil de hacerlo es crear un IntentService que cree un nuevo hilo para usted. –

Cuestiones relacionadas