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

时间:2024-05-23 19:11:07

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

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

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

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

那么再修改下代码:

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

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

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

修改前:

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

修改后:

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

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

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

然后是postToMainThread:

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

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

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

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

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

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

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

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

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

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

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

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