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

这里处理的问题有很多, This class should be static or leaks might occur java android中This class should be static or leaks might occur

这个Handler类应该是静态的或者可能发生泄漏:IncomingHandler

这个Handler类应该是静态的或者可能发生泄漏:AsyncQueryHandler

这个AsyncTask类应该是静态的或者可能发生泄漏(anonymous 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) } } 

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

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

….或者你可以忘记烦人的AsyncTask,并开始使用anko async utils。

我们在Kotlin编码,所以我认为这个代码看起来更好:

 doAsync { //some db persistence here uiThread { toast("Item saved!!") } } 

看看源代码,以便您可以看到WeekReference处理和泄漏的低风险