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回调成员的普通老顶级?
为什么在活动类之外没有 AsyncTask 类声明?
在 Kotlin 中,它可能与 Activity 位于同一文件中,但位于 Activity 类的上方/下方。
这样就不存在隐藏引用的问题。
还要确保在 AsyncTask 中保留对侦听器的 WeakReference。
也就是说,根据我的说法,AsyncTask 已经成为过去,你现在应该使用一些更现代的替代方案,例如 RxJava、协同例程、Loaders 等。
| 归档时间: |
|
| 查看次数: |
4388 次 |
| 最近记录: |