[英]Why are non-null type properties of class obtained from WeakReference.get() changing to nullable
我正在尝试在需要对活动进行引用的活动中编写处理程序。 如果我这样写
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中的属性也可以为空?
这是因为activity?.tv_logged
的返回类型是(假设其为TextView
),TextView? 。 在Kotlin docs中,提出了一种替代方案,以通过if
条件检查null
您的第二个选择是安全呼叫接线员,写成?。 b?.length如果b不为null,则返回b.length,否则返回null。 此表达式的类型是Int? 。
要仅对非空值执行特定操作,可以将安全调用运算符与let一起使用:
activity?.let{ //access activity via `it`}
当我在https://kotlinlang.org/docs/reference/null-safety.html#safe-calls阅读全文时,我理解了这一点
我怀疑这与WeakReference无关。 发生这种情况是因为即使在访问非空类型属性时,安全调用运算符也会返回可空类型。 (文档并没有真正明确明确地指定它。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.