安卓匿名AsyncTask——会导致内存泄漏吗?

5

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

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

在这个示例中,我使用了一个循环,只是为了让子线程永远活着以便演示我的观点。如果我从活动中调用startAsyncTask(),会导致内存泄漏吗?这个类并没有引用活动,但我意识到匿名类实际上是非静态内部类,因此持有对外部类的引用。那么这本身就是一种内存泄漏吗?


你能够先调用服务然后再调用异步任务或线程吗? - Volkan Sonmez
1个回答

5

它将保持对外部类(Activity)的引用,直到任务完成。因此,它会导致Activity的存留时间比绝对必要的时间更长。但是,如果任务在合理的时间内完成,那应该是可以接受的-在任务完成后,它将结束并变得可回收,这将使Activity可回收。更大的问题是长期运行的线程,它们可能持续时间长,远超过Activity的结束时间,或者如果编写不当则永远无法终止。


我明白了。我不知道为什么在这种情况下有人会使用非静态内部类。我将把它转换为嵌套的静态内部类以避免泄漏。 - j2emanue
每个可以的内部类都应该是静态的 - 实际上,他们本应该将其设置为默认值。不是静态的主要原因是如果您需要在内部类中引用父类的变量/函数,则不能是静态的。 - Gabe Sechan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接