2011-06-19 21 views
5

Actualmente estoy haciendo algo como esto en el método onPostExecute del AsyncTask, donde NewTask es no la tarea actual que está ejecutando:Android AsyncTask partir Otra AsyncTask

private class OlderTask extends AsyncTask<String, Void, Integer> { 
    //other functions (not important) 

    @Override 
    protected void onPostExecute(Integer result) { 
     new NewTask().execute(null, null); 
    } 
} 

Me pregunto si esto es una mala idea. ¿Hará esto que GC for the OlderTask espere NewTask? ¿Hay algún otro problema posible con el uso de dicho enfoque?

Y si esto es un problema, ¿cómo puedo rectificarlo?

Respuesta

3

A menos que NewTask sea una clase interna no estática en OlderTask, no impedirá que GC recopile OlderTask a menos que almacene referencia de alguna otra manera.

Pero incluso si GC esperará hasta que se complete NewTask, no debería ser un gran problema a menos que guarde muchos datos en OlderTask o cree muchas copias de OlderTask.

Así que si su diseño requiere hacerlo, está bien. Pero seguramente es más limpio no tener tareas encadenadas.

+0

Gracias. ¿Se aplicaría la misma lógica si 'OlderTask' está creando una nueva' OlderTask'? – yydl

+0

Siempre que sea una instancia diferente de 'OlderTask' y no se refiera directa o indirectamente a la instancia anterior. –

0

Utilizo un método de devolución de llamada, así que cuando el resultado llega a onPostExecute Llamo a otro AsynkTask desde la IU, creo que es una buena idea, déjame saber qué opinas.

public class PatientSearchController extends AsyncTask < String, Void, String > { 

    private PatientSearchResultHandler handler = null; 

    public void onResultHandler(PatientSearchResultHandler handler) { 
     this.handler = handler; 
    } 

    @Override 
    protected String doInBackground(String...params) { 

    } 

    @Override 
    protected void onPostExecute(String result) { 
     this.handler.onResultSuccessHandler(result); 
    } 
}