android — Какой правильный подход к «Этот класс AsyncTask должен быть статическим, иначе могут возникнуть утечки» в Kotlin Android?" />

Какой правильный подход к «Этот класс AsyncTask должен быть статическим, иначе могут возникнуть утечки» в Kotlin Android?

Здесь много вопросов, касающихся This class should be static or leaks might occur в java android.

Этот класс обработчика должен быть статическим или возможны утечки: IncomingHandler

Этот класс обработчика должен быть статическим, иначе утечки могут происходят: 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)
    }
}

Верно ли утверждение о попытке2 и попытке3, что даже без предупреждения Линтера код по-прежнему протекает?

Какие варианты у нас есть, чтобы избежать утечки? Должен ли я решить старый простой код class MyTask : AsyncTask<Unit, Unit, Unit> () с элементом WeakReference для обратного вызова?

14 голосов | спросил user2829759 27 J0000006Europe/Moscow 2017, 10:07:38

1 ответ


0

Почему у вас нет объявления класса AsyncTask вне класса активности?

В Kotlin это может быть тот же файл, что и действие, но чуть выше /ниже класса Activity.

Таким образом, нет никаких проблем со скрытой ссылкой.

Также обязательно сохраняйте WeakReference для слушателя внутри AsyncTask.

Тем не менее, по моему мнению, AsyncTask принадлежит прошлому, и теперь вы должны использовать более современные альтернативы, такие как RxJava, сопрограммы, загрузчики и т.

ответил Vincent Mimoun-Prat 24 52017vEurope/Moscow11bEurope/MoscowFri, 24 Nov 2017 14:28:01 +0300 2017, 14:28:01

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132