android - 异步任务内存泄漏

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

像这样创建 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/

相关文章:

java - 它说必须调用looper.prepare

winforms - 检测 Winforms 中的 gdi/用户处理程序泄漏

android - 在不泄漏内存的情况下在 AsyncTask 中保留对 ContentResolver 的引用是否安全?

android - android studio 更新 api 24 模拟器后显示离线

android - 如何获得最受欢迎的帖子?

c - valgrind 使用 getline 函数报告内存丢失

spring-mvc - Tomcat内存泄漏

android - 使用android连接到sql server时设置登录超时

android - 使用什么设计理念来异步更新UI

java - 模式匹配器替换全部