0

MutableLiveData我的视图模型中有这样的:

val liveData = MutableLiveData<ArrayList<*>>()‍‍‍‍‍

我将端点调用的结果添加到LiveData如下所示:

liveData.value?.addAll(myList)

据我所知,MutableLiveData不应该通知它Observers ,除非你在它上面执行 a setValueor postValue,但此时当我的代码运行时,Observers 会收到更改的通知。

这怎么可能?


更新:

我遇到了一种更奇怪的行为,这个测试通过了,但是列表被打印了一次:[]

    @Test
    fun `strange live data behavior`() {
        val myLiveData = MutableLiveData<ArrayList<Int>>()
        val observer = mock() as Observer<ArrayList<Int>>
        myLiveData.observeForever(observer)
        myLiveData.observeForever { println(it) }
        myLiveData.value = ArrayList()
        verify(observer).onChanged(ArrayList())
        myLiveData.value?.addAll(listOf(1, 2, 3, 4))
        val result = ArrayList<Int>()
        result.add(1)
        result.add(2)
        result.add(3)
        result.add(4)
        verify(observer).onChanged(result)
    }

4

1 回答 1

3

当 aLiveData发送通知时,LiveData不发送项目的副本。相反,它只是将引用传递给持有的同一个实例。

这意味着如果您LiveData像这样修改内部的数据:

myLiveData.value?.addAll(listOf(1, 2, 3, 4))

观察者之前收到的ArrayList对象也将被修改而不会Observer.onChanged()被调用,因为它们是同一个对象。这就是为什么在或任何观察者/反应模式中使用可变对象LiveData通常不是一个好主意。

要验证onChanged()实际上只调用了一次,请在测试末尾添加以下行:

    @Test
    fun `strange live data behavior`() {
        val myLiveData = MutableLiveData<ArrayList<Int>>()
        val observer = mock() as Observer<ArrayList<Int>>
        myLiveData.observeForever(observer)
        myLiveData.observeForever { println(it) }
        myLiveData.value = ArrayList()
        verify(observer).onChanged(ArrayList())
        myLiveData.value?.addAll(listOf(1, 2, 3, 4))
        val result = ArrayList<Int>()
        result.add(1)
        result.add(2)
        result.add(3)
        result.add(4)
        verify(observer).onChanged(result)

        // Below should pass because onChanged is only called once.
        verify(observer, times(1)).onChanged(any()) 
    }
于 2019-07-09T20:34:57.303 回答