我使用MVVM体系结构,但是有一次我将clicklistener传递给ViewModel。我在片段onCreate
中进行操作-我将侦听器传递给ViewModel,并将其包装在WeakReference对象中,并作为字段存储在ViewModel中。
private var weakRefListener: WeakReference<ClickListener>? = null
private val listenerViewModel = object : ClickListener {
override fun onClicked(id: Long) {
weakRefListener?.get()?.onClicked(id)
}
}
/* called in Fragment */
fun setClickListener(clickListener: ClickListener) {
weakRefListener = WeakReference(clickListener)
}
我这样做的原因-我有一些UI元素,它们表示为数据类,并且希望在屏幕旋转后保留它们。
ViewModel的对象需要此点击侦听器,并且它们引用listenerViewModel
。不幸的是,我观察到不确定的行为-有时weakRefListener?.get()
返回null
,而我无法预测何时。这会导致不良的用户体验,因为点击无效。
问题: -为什么会这样? -组织代码的更好方法是什么?