2012-06-25 24 views
15

He utilizado AsyncTasks con mi aplicación, para descargar y actualizar la IU de forma perezosa.Android AsyncTasks Cómo verificar Si la actividad aún se está ejecutando

Por ahora mi AsyncTasks actualiza la interfaz de usuario real, simplemente:

protected void onProgressUpdate(String... values) { 
     super.onProgressUpdate(values); 
     gender.setText(values[0]); 
} 

Mi problema es cómo comprobar si la actividad que el género representa a partir TextView, todavía está disponible?

Si no, recibiré un error y mi aplicación se cerrará.

+0

no está seguro de si se puede tratar con (null && == género gender.isShown()) –

Respuesta

25

Puede cancelar su AsyncTask en OnDestroy de la actividad

@Override 
protected void onDestroy() { 
    asynctask.cancel(true); 
    super.onDestroy(); 
} 

y cuando se realizan cambios que comprobar si su AsyncTask ha sido cancelado (actividad destruida) o no

protected void onProgressUpdate(String... values) { 
    super.onProgressUpdate(values); 
    if(!isCancelled()) { 
     gender.setText(values[0]); 
    } 
} 
+0

Agradable. Pero no hay nadie que llame a ondestroy cada vez. (Para el enlace de referencia a continuación). ¿Cómo lidias con eso? https://stackoverflow.com/a/4449988/3265444 – Ajji

0

En caso de no

if (gender) { 
    gender.setText(values[0]); 
} 

será suficiente?

+0

está tomando para (null == género)? incluso para eso, no solo eso no es suficiente en algún momento –

+1

No, eso no es suficiente. La actividad puede finalizar, pero el género puede seguir siendo no nulo, y los intentos de referencia fallarán porque la Vista/Ventana ya no está activa. – AgileYogi

1

Aunque nunca me he enfrentado a este escenario; Trataré de responder tu pregunta.

En su caso, deberá validar el Context pasado al AsyncTask.

Puede realizar la validación

if(null!=mContext) //Activity still exist!! 
{ 
    gender.setText(values[0]); 
} 
else //Activity is destroyed 
{ 
    //Take appropriate action!! 
} 

La ventaja será, si la actividad es destruido por el momento de llegar a esta declaración, su Context se convertirá automáticamente en null y se puede controlar el escenario.

+2

Esto no funcionará. Debido a que mantiene una referencia dura a la actividad, no se anulará. Se volverá inválido, pero la tarea asíncrona continuará manteniendo la referencia a la actividad. – uthark

1

que insistirá en que se que si su actividad no se está ejecutando, ¿por qué no cancela AsyncTask? Esa sería una solución mejor y más viable. Si su Aplicación se ejecuta, digamos que pasa de una Actividad a otra, entonces no dará error AFAIK.

Pero, insisto para cancelar la AsyncTask continuación you'r La actividad no se está ejecutando, se puede comprobar AsyncTask está funcionando o no,

if(task != null && task.equals(AsyncTask.Status.RUNNING)) 
task.cancel(true); 
2

Trate

if (!isFinishing()) { 
    gender.setText(values[0]); 
} 
5

que tenía un parecido Problema: básicamente obtenía un NPE en una tarea asíncrona después de que el usuario destruyó el fragmento. Después de investigar el problema de desbordamiento de pila, adopté la siguiente solución:

volatile boolean running; 

public void onActivityCreated (Bundle savedInstanceState) { 

    super.onActivityCreated(savedInstanceState); 

    running=true; 
    ... 
    } 


public void onDestroy() { 
    super.onDestroy(); 

    running=false; 
    ... 
} 

Entonces, puedo comprobar "si se ejecuta" periódicamente en mi código asíncrono. He probado el estrés y ahora no puedo "romper" mi actividad. Esto funciona perfectamente y tiene la ventaja de ser más simple que algunas de las soluciones que he visto en SO.

+0

¡MUCHAS GRACIAS! ¡POR FIN LO CONSEGUÍ PARA TRABAJAR! – sshashank124

+1

Esto es simple y realmente tiene sentido :) Si alguien está pensando en esa palabra clave 'volátil', lea esto: http://stackoverflow.com/a/107040/4331787 –

1

Como this parte de una capacitación sobre Desarrolladores de Android sugiere, mantener una WeakReference en el elemento de interfaz de usuario que necesita ser actualizado después de la tarea se lleva a cabo y comprobar si la referencia es null antes de usarlo. Esto ayuda no solo a verificar si la UI todavía está presente, sino que también evita que se eliminen los elementos de la IU.

1

Comprobar si la actividad se está ejecutando o no

if (!isFinishing()) { 
    // Do whatever you want to do 
} 
Cuestiones relacionadas