像这样创建 asyncTask
AsyncTask<Void,Void,Void> newTask = new AsyncTask<Void,Void,Void>{
....
}
newTask.execute()
造成内存泄漏?
最佳答案
好的,然后@sherays 特别是在您的情况下,如果您在前一个请求尚未完成时对服务器执行另一个请求(在类似请求的情况下),这可能会导致内存泄漏。
实际上,AsyncTask
回收不应该有任何问题,除非您从 param 持有对它的任何引用或在 doInBackground() 中产生内存泄漏。
因此,您可能会想,如果您正在创建许多长时间运行的 AsyncTask,那么它会导致一些内存问题。实际上它不是真的(至少在最新的 Android 版本上)。 AsyncTask 源码显示
它使用单例有界执行器:
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);
这意味着执行器不会同时运行超过 128 个 AsyncTask(根据我的理解,128 个不是很大)。
它对执行器使用有界查询:
private static final BlockingQueue<Runnable> sPoolWorkQueue =
new LinkedBlockingQueue<Runnable>(10);
所以,基于以上几点,同时创建和运行的AsyncTasks的数量是有限的,不会太大。因此,如果您在 AsyncTask 中的代码没有造成任何内存泄漏,那么根据我的理解就没有问题。同时 Android 不会让您使用 AsyncTasks 发送垃圾邮件。查看 ThreadPoolExecutors
描述以熟悉它管理内存的方式(如果您担心同时创建的线程太多)。
所以,如果遇到内存泄漏,则取消任务:
关于 cancel()
调用,基于 AsyncTask 的 Android 文档:
取消任务
可以随时通过调用 cancel(boolean) 来取消任务。调用此方法将导致对 isCancelled() 的后续调用返回 true。调用此方法后,将在 doInBackground(Object[]) 返回后调用 onCancelled(Object)
,而不是 onPostExecute(Object)。为确保尽快取消任务,您应该始终定期从 doInBackground(Object[])
检查 isCancelled()
的返回值,如果可能(内部例如一个循环。)
关于android - 异步任务内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20709812/