Fuga de memoria AsyncTask

No crea asyncTask como

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

Crear fugas de memoria?

Ok entonces @sherays Especialmente en su caso, Si ejecuta otra solicitud al servidor mientras que la anterior no ha terminado todavía (en 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, se podría pensar, que si está creando muchas AsyncTasks de larga duración, entonces podría conducir a algunos problemas de memoria. En realidad no es cierto (al menos en las últimas versiones de Android). El código fuente AsyncTask muestra que

Utiliza el ejecutor boundton de 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); 

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

Utiliza la consulta limitada para el Ejecutor:

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

Por lo tanto, sobre la base de los puntos anteriores, el número de creado y ejecutando AsyncTasks mismo tiempo son limitados y no tan grande. Por lo tanto, si su código dentro de AsyncTask no crea fugas de memoria, entonces por mi entendimiento no hay ningún problema. Al mismo tiempo, Android no le permitirá spam propio con AsyncTasks. Checkout Descripción de ThreadPoolExecutors para familiarizarse con la forma en que gestiona una memoria (si se preocupa por demasiados hilos creados al mismo tiempo).

Por lo que aún, si se enfrenta a la fuga de memoria y luego cancelar la tarea:

Respecto a la llamada cancel() , basada en la documentación de Android para AsyncTask:

Cancelación de una tarea

Se puede cancelar una tarea en cualquier momento invocando cancel (boolean). Invocar este método hará que las llamadas posteriores a isCancelled () devuelvan true. Después de invocar este método, onCancelled(Object) , en lugar de onPostExecute (Object) será invocado después de doInBackground (Object []) devuelve. Para asegurar que una tarea se cancele lo más rápidamente posible, siempre debe comprobar periódicamente el valor isCancelled() de isCancelled() desde doInBackground(Object[]) , si es posible (dentro de un bucle por ejemplo).

Sí: ¿se recoge la basura de hilo después de que onPostExecute se llama o aún está en la memoria?

Una Tarea Asíncrona no será cancelada o destruida en el momento en que se retire la actividad. Si su hilo es más o menos ligero y termina después de un tiempo pequeño, sólo manténgalo en ejecución y agregue una cláusula yourActivity.this.isFinishing() en el onPostExecuteMethod .

  • Trafficstats de aplicación específica
  • Pérdida de paquetes mientras recibe la transmisión UDP en el dispositivo android
  • Encontrar máquinas en la red local basada en el puerto (descubrimiento de red) en android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.