当前位置: 首页 > 知识库问答 >
问题:

对于Kotlin Android中的“这个AsyncTask类应该是静态的,否则可能会发生泄漏”,正确的方法是什么?

常睿范
2023-03-14

此AsyncTask类应该是静态的,否则可能发生泄漏(匿名Android.os.AsyncTask)

该警告是由于内部类持有对外部类的隐式引用,因此阻止外部类进行GC。解决方案在于警告本身,即该类应该声明为静态的。

但是,解决方案是java特有的。鉴于kotlin没有静态修饰符,最接近的是companion object,而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)
    }
}

共有1个答案

司马狐若
2023-03-14

为什么没有activity类之外的AsyncTask类声明

在Kotlin中,它可以与活动在同一个文件中,但刚好在活动类的上方/下方。

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

 类似资料: