【问题标题】:AsyncTask memory leakAsyncTask 内存泄漏
【发布时间】: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


    【解决方案1】:

    好的,然后@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() 的返回值,如果可能(例如在循环内)。

    【讨论】:

      【解决方案2】:

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

      在 Activity 关闭时,不会取消或销毁异步任务。如果您的线程或多或少 轻量级 并且在一小段时间后完成,请保持其运行并在 onPostExecuteMethod 中添加 yourActivity.this.isFinishing() 子句。

      【讨论】:

      猜你喜欢
      • 2017-05-16
      • 1970-01-01
      • 2019-02-13
      • 2021-12-27
      • 2011-03-03
      • 1970-01-01
      • 2017-01-31
      • 2015-04-04
      • 2017-05-28
      相关资源
      最近更新 更多