AsyncTask内存泄漏

时间:2013-12-20 18:27:47

标签: android memory-leaks android-asynctask network-programming

创建asyncTask,如

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

创建内存泄漏?

2 个答案:

答案 0 :(得分:4)

好吧那么@sherays特别是在你的情况下,如果你对服务器执行另一个请求而前一个请求尚未完成(如果有类似的请求),这可能是内存泄漏。

实际上,AsyncTask回收不应该有任何问题,除非你从param中引用它或在doInBackground().内生成内存泄漏

所以,你可能会想,如果你正在创建许多长时间运行的AsyncTasks,那么它会导致一些内存问题。实际上它不是真的(至少在最新的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);

所以,基于以上几点,AsyncTasks创建和运行的次数是有限的而不是那么大。所以,如果AsyncTask中的代码没有创建任何内存泄漏,那么根据我的理解,没有问题。同时Android不允许您使用AsyncTasks自行发送垃圾邮件。 Checkout ThreadPoolExecutors说明以熟悉它管理内存的方式(如果您担心同时创建的线程太多)。

所以,如果你面临内存泄漏,那么取消任务:

关于cancel()调用,基于AsyncTask的Android文档:

取消任务

可以通过调用cancel(boolean)随时取消任务。调用此方法将导致后续调用isCancelled()返回true。调用此方法后,将在doInBackground(Object [])返回后调用onCancelled(Object)而不是onPostExecute(Object)。为了确保尽快取消任务,您应该始终从isCancelled()定期检查doInBackground(Object[])的返回值,如果可能的话(例如在循环内)。

答案 1 :(得分:0)

是:在调用onPostExecute之后收集的线程是垃圾还是在内存中?

在解除活动时,不会取消或销毁异步任务。如果你的帖子在一小段时间后或多或少轻量级完成,只需让它继续运行并在yourActivity.this.isFinishing()中添加onPostExecuteMethod子句。