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正しいについての主張はありますか?
漏れを防ぐためにどのようなオプションが必要ですか? コールバックにWeakReference
のメンバーを持つ普通の古いトップレベルclass MyTask : AsyncTask<Unit, Unit, Unit>()
に解決する必要がありますか?
を使用する必要があります私は 'AsyncTaskを言いたいです'できるだけローカルにする必要があります。上のすべてのコードは間違った使い方です。それは、使用直後に処分/放出することを意味する。 –
Kotlinのネストされたクラスは、デフォルトでJavaの 'static class'に相当します。' Attempt2Task'の 'inner'キーワードを削除しようとしましたか? https://kotlinlang.org/docs/reference/nested-classes.html –
@JKを参照してくださいありがとう!私は '内部クラス'セクションを何度も読んだことがありますが、入れ子クラスは外部クラスのメンバにアクセスできません。 – user2829759