2010-11-18 13 views
10

Si interpreto esto article correctamente, pasar el contexto de actividad a AsyncTasks es una posible fuga, ya que la actividad podría destruirse mientras la tarea aún se está ejecutando.Se filtra el contexto de Android en AsyncTask

¿Cómo lidiar con esto en AsyncTasks que no son clases internas y necesitan acceso a recursos o actualizar la IU?

Además, ¿cómo puede evitar filtrar el contexto si necesita referencias a los cuadros de diálogo de progreso para descartarlos?

+0

Mire [esto] (http://stackoverflow.com/questions/3821423/background-task-progress-dialog-orientation-change-is-there-any-100-working/3821998#3821998). Se trata de cambios de orientación, pero se trata de mantener de forma segura una referencia a una actividad/contexto. –

Respuesta

11

Si entiendo su pregunta correctamente: la clase WeakReference o SoftReference de Java es una buena opción para este tipo de situación. Le permitirá pasar el contexto a AsyncTask sin evitar que el GC libere el contexto si es necesario.

El GC está más ansioso al recopilar WeakReferences que cuando recopila SoftReferences.

en lugar de:

FooTask myFooTask = new FooTask(myContext); 

su código se vería así:

WeakReference<MyContextClass> myWeakContext = new WeakReference<MyContextClass>(myContext); 
FooTask myFooTask = new FooTask(myWeakContext); 

y en el AsyncTask en lugar de:

myContext.someMethod(); 

su código se vería así:

myWeakContext.get().someMethod(); 
+4

solo asegúrate de que myWeakContext.get() no devuelva nulo, de lo contrario lo arruinaste. –

+0

Esto funciona si no es estrictamente necesario hacer las actualizaciones de la interfaz de usuario una vez que la tarea finaliza. Si los resultados de la tarea asincrónica son necesarios después de que se recrea la actividad, deberá usar un enfoque diferente. Los fragmentos sin cabeza configurados para retener el estado pueden administrar sus tareas. – r1k0

Cuestiones relacionadas