繁体   English   中英

为什么从WeakReference.get()获得的类的非null类型属性更改为nullable

[英]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_loggedmHandler是可为空的接收器类型,需要使用?进行访问。 我可以了解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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM