Я пытаюсь написать обработчик в действии, для которого требуется ссылка на действие.Если я напишу так:
class MainActivity : AppCompatActivity() {
private val mHandler = MainActivityHandler(this)
class MainActivityHandler(val activity: MainActivity) : Handler() {
override fun handleMessage(msg: Message?) {
when(msg?.what) {
MSG_CHANGE_TEXT -> {
activity.tv_logged.setText(R.string.title_main)
activity.mHandler.sendMessageDelayed(obtainMessage(SOMETHING), 3000)
}
// ...
}
}
}
}
Этот код компилируется и работает как положено.Но если я попытаюсь передать слабую ссылку на активность, подобную этой
class MainActivity : AppCompatActivity() {
private val mHandler = MainActivityHandler(WeakReference(this))
class MainActivityHandler(val activityRef: WeakReference<MainActivity>) : Handler() {
private val activity
get() = activityRef.get()
override fun handleMessage(msg: Message?) {
when(msg?.what) {
MSG_CHANGE_TEXT -> {
activity?.tv_logged.setText(R.string.title_main)
activity?.mHandler.sendMessageDelayed(obtainMessage(SOMETHING), 3000)
}
// ...
}
}
}
}
Теперь компилятор жалуется, что tv_logged и mHandler относятся к типу приемника, допускающему обнуляемый тип, и ему необходимобыть доступным с помощью?Я могу понять, что val activity: MainAcitivity?
внутри обработчика имеет значение NULL, потому что оно исходит из WeakReference.get (), но почему свойства в MainActivity также могут иметь значение NULL?