今天突发奇想,livedata的回调方法名字是onChanged,看名字像是,在值变化了之后会进行回调,那么如果两次给MutableLiveData设置的值是完全一样的话,还会不会走onChanged回调呢?那么就有了接下来这个实验
一开始,我是在执行网络请求的时候将MutableLiveData进行初始化:
这样写,不管怎么想,都会回调的,起码两个变量的hashCode就不一样起码会根据hashCode进行比对的,对不对?
那么再修改下代码:
像这样将livedata设置成成员变量,就可以保证起码是同一个引用吗,在onChanged将结果打印出来
修改前:
修改后:
全部回调成功!ok,看下livedata源码是怎么写的,灵魂当然是postValue
然后是postToMainThread:
其中mDelegate是一个TaskExecutor,我们既然没有定义,那就DefaultTaskExecutor
可以看到是将值post到主线程进行改变,这就是为啥setValue一定要在主线程,子线程用postValue的原因了
那么最后还是调用的setValue,下面最重要的来了:
最最重要的mVersion字段,可以知道,每次postValue或者setValue,都会使它自增
这里的considerNotify就是通知给各位接收者了:
到这里一目了然,只要mVersion是大于等于之前的值,就会回调onChanged方法,也就是说,不管值是否相同,只看version的值,也就是基本只有int到达最大值的时候才会导致bug,2的31次方-1,估计只有无聊的人才会写改这么多次值的代码了。。