Жалобы Android Studio довольно разумные.Проблема в том, что анонимные классы захватывают ссылку на родительский класс, в котором они были созданы.
В основном есть два решения: "не очень" и "уродливо". Оба они о WeakReference.
# 1 Непростое решение - создать класс, который будет принимать слабый реф
class ApiRetryCallback(activity: Activity): RetryCallback(NUMBER, DELAY) {
private val weakActivity = WeakReference(activity)
override fun onRetry(retryCount: Int) {
weakActivity.get()!!.mySdkApi.applicationStartup(this) //or weakThis.get()? to swallow null cases
}
override fun onCompleted(): Boolean {
weakActivity.get()!!.updateStatus(Callback.Status.StartUpSDK)
return true
}
override fun onFailed(e: MyException?) {
weakActivity.get()!!.updateStatus(Callback.Status.StartUpSDK, "", e)
}
}
В действии:
private val startupCallback = ApiRetryCallback(this) //this is MainActivity here
# 2 Уродливое решение основано на том факте, что лямбда-выражения должны захватывать родительскую ссылку, только там, где она используется напрямую.Итак, я придумал эту замену и не увидел сильных ссылок в отладчике, но вы должны проверить, что:
private val startupCallback = {
val weakActivity = WeakReference(this@MainActivity)
object : RetryCallback(NUMBER, DELAY) { //returned as last expression
override fun onRetry(retryCount: Int) {
weakActivity.get()!!.mySdkApi.applicationStartup(this) //or weakThis.get()? to swallow null cases
}
//....else methods....
}
}()
Здесь лямбда будет вызываться немедленно и будет захватывать только слабые ссылки внутри объектаТакже он вернет последнее выражение, которое является объектом.
# 3 Пока я писал, я нашел третье решение, близкое к # 2
private val startupCallback = WeakReference(this).let { //this here is MainActivity
val weakActivity = it //it of let scope wich is WeakReference
object : RetryCallback(NUMBER, DELAY) { //returned as last expression
override fun onRetry(retryCount: Int) {
weakActivity.get()!!.mySdkApi.applicationStartup(this) //or weakThis.get()? to swallow null cases
}
//....else methods....
}
}