在这里处理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