Получатель WeakReference возвращает ноль - PullRequest
0 голосов
/ 05 декабря 2018

Я использую архитектуру 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)
}

Причина, по которой я это делаю - у меня есть элементы пользовательского интерфейса, которыепредставлены как классы данных, и я хочу сохранить их после поворота экрана.

В ViewModel есть объекты, которым нужен этот clicklistener, и они ссылаются на listenerViewModel.К сожалению, я наблюдал недетерминированное поведение - иногда weakRefListener?.get() возвращает null, и я не могу предсказать, когда.Это приводит к плохому пользовательскому опыту, так как щелчок не работает.

Вопрос: - почему это происходит?- как лучше организовать код?

...