【问题标题】:android anonymous asyncTask - will it cause memory leakandroid匿名asyncTask - 它会导致内存泄漏
【发布时间】:2017-01-31 05:34:02
【问题描述】:

在 android 中,我试图防止内存泄漏。我继承了一些遗留代码,开发人员在其中创建了一个 asyncTask 作为匿名内部类,如下所示:

 void startAsyncTask() {
    new AsyncTask<Void, Void, Void>() {
        @Override protected Void doInBackground(Void... params) {
            while(true);//loop  to keep thread alive forever.
        }
    }.execute();
}

所以我在这个例子中使用了一个循环,只是为了让子线程永远活着,这样我就可以演示我的观点了。 所以如果我打电话给startAsyncTask(),会不会有内存泄漏?该类没有活动引用,但我意识到匿名类实际上是一个非静态内部类,因此拥有对外部类的引用。那么这本身就是内存泄漏是真的吗?

【问题讨论】:

  • 你可以调用服务然后调用异步任务或线程

标签: java android memory-leaks


【解决方案1】:

它将保持对外部类(活动)的引用,直到任务完成。因此,它将导致活动的举行时间超过绝对必要的时间。但是,如果任务在合理的时间内完成,那应该没问题 - 完成后任务将结束并变为可垃圾收集,这将使 Activity 可垃圾收集。更大的问题是长期线程可能会持续到活动结束之后,或者如果写得不好则根本不会终止。

【讨论】:

  • 我明白了。我不知道为什么在这种情况下有人会做一个非静态内部类。我会将其转换为嵌套的静态内部类以避免泄漏。
  • 每个可能的内部类都应该是静态的——实际上他们应该将其设为默认值。不是静态的一个重要原因是如果您需要在内部类中引用父级的变量/函数 - 在这种情况下它不能是静态的。
猜你喜欢
  • 2017-01-06
  • 2011-03-03
  • 2011-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-24
  • 2011-09-03
  • 2020-10-24
相关资源
最近更新 更多