在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()
会有内存泄漏?类没有活动引用,但我意识到匿名类实际上是一个非静态内部类,因此持有对外部类的引用。那么,这本身是一个内存泄漏是真的吗?
它将保存对外部类(Activity)的引用,直到任务完成。因此,这将导致活动持续的时间超过绝对必要的时间。然而,如果任务在合理的时间内完成,那应该是可以的——在它完成后,任务将结束并成为垃圾收集,这将使Activity垃圾收集。更大的问题是长期线程,它可以在活动结束后很好地持续下去,或者如果写得不好根本不会终止。