【发布时间】:2013-12-20 18:27:46
【问题描述】:
是否像创建 asyncTask 一样
AsyncTask<Void,Void,Void> newTask = new AsyncTask<Void,Void,Void>{
....
}
newTask.execute()
造成内存泄漏?
【问题讨论】:
标签: android memory-leaks android-asynctask network-programming
是否像创建 asyncTask 一样
AsyncTask<Void,Void,Void> newTask = new AsyncTask<Void,Void,Void>{
....
}
newTask.execute()
造成内存泄漏?
【问题讨论】:
标签: android memory-leaks android-asynctask network-programming
好的,然后@sherays 特别是在您的情况下,如果您在前一个尚未完成的情况下向服务器执行另一个请求(在类似请求的情况下),这是内存泄漏的机会。
实际上,AsyncTask 回收不应该有任何问题,除非您从参数中持有对它的任何引用或在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 个 AsyncTasks(根据我的理解,128 个并不是很大)。
它对 Executor 使用有界查询:
private static final BlockingQueue<Runnable> sPoolWorkQueue =
new LinkedBlockingQueue<Runnable>(10);
因此,基于以上几点,同时创建和运行的 AsyncTask 的数量是有限的,并且不是很大。因此,如果您在 AsyncTask 中的代码没有造成任何内存泄漏,那么根据我的理解,没有问题。同时 Android 不会让您使用 AsyncTasks 向自己发送垃圾邮件。查看ThreadPoolExecutors 描述以熟悉它管理内存的方式(如果您担心同时创建的线程过多)。
还是这样,如果您遇到内存泄漏,请取消任务:
关于cancel() 调用,基于 Android 文档的 AsyncTask:
取消任务
可以通过调用 cancel(boolean) 随时取消任务。调用此方法将导致对 isCancelled() 的后续调用返回 true。调用此方法后,将在 doInBackground(Object[]) 返回后调用onCancelled(Object),而不是 onPostExecute(Object)。为确保尽快取消任务,应始终从doInBackground(Object[]) 定期检查isCancelled() 的返回值,如果可能(例如在循环内)。
【讨论】:
是的:你的线程垃圾是在调用onPostExecute 之后收集的还是仍在内存中?
在 Activity 关闭时,不会取消或销毁异步任务。如果您的线程或多或少 轻量级 并且在一小段时间后完成,请保持其运行并在 onPostExecuteMethod 中添加 yourActivity.this.isFinishing() 子句。
【讨论】: