gpt4 book ai didi

android - Kotlin Android 中 "This AsyncTask class should be static or leaks might occur"的正确方法是什么?

转载 作者:IT老高 更新时间:2023-10-28 13:32:40 34 4
gpt4 key购买 nike

这里有很多关于 This class should be static or leaks might occur 的问题。在java android中。

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。解决方案在于警告本身,该类应声明为静态。

但是,解决方案是特定于 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)
}
}

关于尝试 2 和尝试 3 的断言是否正确,即使没有 linter 警告,代码仍然在泄漏?

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

最佳答案

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

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

这样就不会有隐藏引用的问题。

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

也就是说,根据我的说法,AsyncTask 属于过去,您现在应该使用一些更现代的替代品,例如 RxJava、协程、加载器等。

关于android - Kotlin Android 中 "This AsyncTask class should be static or leaks might occur"的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44774187/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com