在這裏處理java android的This class should be static or leaks might occur
有很多問題。在Kotlin Android中,「這個AsyncTask類應該是靜態還是可能發生泄漏」的正確方法是什麼?
This Handler class should be static or leaks might occur: IncomingHandler
This Handler class should be static or leaks might occur:AsyncQueryHandler
This AsyncTask class should be static or leaks might occur (anonymous android.os.AsyncTask)
該警告是由於內部類持有外部類的隱式引用,並且因此防止GC'd外部類的事實。 解決方案在於警告本身,該類應聲明爲靜態。
但是,解決方案是java特定的。鑑於kotlin沒有static
修飾符,最接近的是companion object並且伴侶對象確實引用了它的「外部類」。
下面是我的[失敗]與言論試圖
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)
}
}
約ATTEMPT2和attempt3正確,即使沒有棉短絨警告,該代碼仍然漏水的說法對嗎?
我們有什麼選擇可以避免泄漏? 我是否應該解決普通舊的頂級class MyTask : AsyncTask<Unit, Unit, Unit>()
與WeakReference
成員回調?
我想說'的AsyncTask '應儘可能在當地。所以上面的所有代碼都是錯誤的用法。這意味着在使用後立即處置/釋放它。 –
默認情況下,Kotlin中的嵌套類相當於Java中的'static class' - 您是否嘗試刪除'Attempt2Task'的'inner'關鍵字?見https://kotlinlang.org/docs/reference/nested-classes.html –
@JK謝謝指出!我已經多次閱讀了「內部類」節,卻沒有意識到它暗示了嵌套類沒有訪問外部類的成員! – user2829759