【发布时间】:2025-11-24 23:05:04
【问题描述】:
我正在尝试在需要引用该活动的活动中编写处理程序。如果我这样写
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? 可以为空,因为它来自 WeakReference.get() 但是为什么 MainActivity 中的属性也可以为空?
【问题讨论】:
标签: android kotlin weak-references android-handler