livedata传相同的值会不会执行onchanged回调

今天突发奇想,livedata的回调方法名字是onChanged,看名字像是,在值变化了之后会进行回调,那么如果两次给MutableLiveData设置的值是完全一样的话,还会不会走onChanged回调呢?那么就有了接下来这个实验

一开始,我是在执行网络请求的时候将MutableLiveData进行初始化:

livedata传相同的值会不会执行onchanged回调_第1张图片

这样写,不管怎么想,都会回调的,起码两个变量的hashCode就不一样起码会根据hashCode进行比对的,对不对?

那么再修改下代码:

livedata传相同的值会不会执行onchanged回调_第2张图片

livedata传相同的值会不会执行onchanged回调_第3张图片

像这样将livedata设置成成员变量,就可以保证起码是同一个引用吗,在onChanged将结果打印出来

修改前:

修改后:

全部回调成功!ok,看下livedata源码是怎么写的,灵魂当然是postValue

livedata传相同的值会不会执行onchanged回调_第4张图片

然后是postToMainThread:

其中mDelegate是一个TaskExecutor,我们既然没有定义,那就DefaultTaskExecutor

livedata传相同的值会不会执行onchanged回调_第5张图片

可以看到是将值post到主线程进行改变,这就是为啥setValue一定要在主线程,子线程用postValue的原因了

livedata传相同的值会不会执行onchanged回调_第6张图片

那么最后还是调用的setValue,下面最重要的来了:

livedata传相同的值会不会执行onchanged回调_第7张图片

最最重要的mVersion字段,可以知道,每次postValue或者setValue,都会使它自增

livedata传相同的值会不会执行onchanged回调_第8张图片

这里的considerNotify就是通知给各位接收者了:

livedata传相同的值会不会执行onchanged回调_第9张图片

到这里一目了然,只要mVersion是大于等于之前的值,就会回调onChanged方法,也就是说,不管值是否相同,只看version的值,也就是基本只有int到达最大值的时候才会导致bug,2的31次方-1,估计只有无聊的人才会写改这么多次值的代码了。。

你可能感兴趣的:(Android,livedata)