leaks leak handling context canary asynctask android memory-leaks android-asynctask network-programming

context - memory leak handling in android



AsyncTask memory leak (2)

Sí: ¿se recolectó la basura de su hilo después de onPostExecute o todavía está en la memoria?

Una tarea asíncrona no se cancelará ni destruirá en el momento en que se descarte la actividad. Si su hilo es más o menos ligero y termina después de un tiempo pequeño, simplemente manténgalo funcionando y agregue una cláusula yourActivity.this.isFinishing() en el onPostExecuteMethod .

hace la creación de asyncTask como

AsyncTask<Void,Void,Void> newTask = new AsyncTask<Void,Void,Void>{ .... } newTask.execute()

crear pérdidas de memoria?


ok then @sherays Especialmente en su caso, si ejecuta otra solicitud en el servidor mientras que la anterior aún no ha finalizado (en el caso de solicitudes similares), esta es una posibilidad de pérdida de memoria.

En realidad, no debería haber ningún problema con el reciclaje de AsyncTask menos que tenga alguna referencia a él desde param o genere pérdidas de memoria dentro de doInBackground().

Por lo tanto, podría pensar que si está creando muchas AsyncTasks de larga ejecución, entonces provocaría algunos problemas de memoria. En realidad, no es cierto (al menos en las últimas versiones de Android). El código fuente de AsyncTask muestra que

Utiliza el ejecutor limitado singleton:

private static final int CORE_POOL_SIZE = 5; private static final int MAXIMUM_POOL_SIZE = 128; private static final int KEEP_ALIVE = 1; public static final Executor THREAD_POOL_EXECUTOR = new ThreadPoolExecutor(CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE, TimeUnit.SECONDS, sPoolWorkQueue, sThreadFactory);

Eso significa que el ejecutor no ejecutará más de 128 AsyncTasks al mismo tiempo (128 no es muy grande, según entiendo).

Utiliza consulta acotada para el Ejecutor:

private static final BlockingQueue<Runnable> sPoolWorkQueue = new LinkedBlockingQueue<Runnable>(10);

Por lo tanto, en función de los puntos anteriores, la cantidad de veces que se creó y se ejecuta al mismo tiempo AsyncTasks es limitada y no tan grande. Entonces, si su código dentro de AsyncTask no crea ninguna fuga de memoria, entonces, según entiendo, no hay problema. Al mismo tiempo, Android no permitirá que usted se spam con AsyncTasks. ThreadPoolExecutors descripción de ThreadPoolExecutors para familiarizarse con la forma en que administra una memoria (si se preocupa por demasiados hilos creados al mismo tiempo).

así que, si enfrentas una fuga de memoria, cancela la tarea:

Con respecto a la llamada a cancel() , según la documentación de Android para AsyncTask:

Cancelando una tarea

Una tarea puede cancelarse en cualquier momento invocando cancelar (booleano). La invocación de este método provocará que las llamadas posteriores a isCancelled () devuelvan verdadero. Después de invocar este método, onCancelled(Object) , en lugar de onPostExecute (Object) se invocará después de que doInBackground (Object []) regrese. Para garantizar que una tarea se cancele lo más rápido posible, siempre debe verificar el valor de retorno de isCancelled() periódicamente desde doInBackground(Object[]) , si es posible (dentro de un bucle, por ejemplo).