在Kotlin Android中,"这个AsyncTask类应该是静态的还是可能发生泄漏"的正确方法是什么?

use*_*759 14 android memory-leaks kotlin android-lint

这里有很多关于This class should be static or leaks might occurjava android的问题.

此Handler类应该是静态的,否则可能会发生泄漏:IncomingHandler

此Handler类应该是静态的,否则可能会发生泄漏:AsyncQueryHandler

这个AsyncTask类应该是静态的,否则可能会发生泄漏(匿名android.os.AsyncTask)

警告是由于内部类保存了对外部类的隐式引用,因此阻止了外部类的GC'd.解决方案在于警告本身应该将类声明为静态.

但是,该解决方案是特定于Java的.鉴于kotlin没有static修饰符,最接近的是伴随对象,伴随对象确实引用了它的"外部类".

以下是我的[失败]尝试的评论

class MyActivity : AppCompatActivity(), MyListener {

    companion object {
        class Attempt3Task(val callback: MyListener) : AsyncTask<Unit, Unit, Unit>() {
            override fun doInBackground(vararg params: Unit?) {
                TODO("")
            }

            override fun onPostExecute(result: Unit?) {
                callback.updateUi()
            }
        }
    }

    inner class Attempt2Task : AsyncTask<Unit, Unit, Unit> () {
        override fun doInBackground(vararg params: Unit?) {
            TODO("
        }
    }

    // Gives warning "This AsyncTask class should be static or leaks might occur"
    val attempt_1 = object: AsyncTask<Unit, Unit, Unit>() {
        override fun doInBackground(vararg params: Unit?) {
            TODO("")
        }
    }

    // Does not give warning but, as far as I can tell, is conceptually same as attempt_1
    val attempt_2 = Attempt2Task()

   // Does not give warning but companion object does have reference to the activity, no?
    val attempt_3 = Attempt3Task(this)

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
    }
}
Run Code Online (Sandbox Code Playgroud)

关于attempt2和attempt3的断言是否正确,即使没有linter警告,代码仍在泄漏?

我们有什么选择来避免泄漏?我应该解决class MyTask : AsyncTask<Unit, Unit, Unit> ()WeakReference回调成员的普通老顶级?

Vin*_*rat 1

为什么在活动类之外没有 AsyncTask 类声明?

在 Kotlin 中,它可能与 Activity 位于同一文件中,但位于 Activity 类的上方/下方。

这样就不存在隐藏引用的问题。

还要确保在 AsyncTask 中保留对侦听器的 WeakReference。

也就是说,根据我的说法,AsyncTask 已经成为过去,你现在应该使用一些更现代的替代方案,例如 RxJava、协同例程、Loaders 等。