为什么在进行数据更改之前调用 LiveData onChanged?

Why is LiveData onChanged called before data change is made?

上下文

使用MutableLiveData来保存一个值。 Button 点击应该增加值。

问题

MutableLiveDataObserver.onChanged() 似乎在 MutableLiveData.setValue() 用于更改值之前被调用。

例如,在Button点击之前,onChanged日志发生在初始值设置之后(onChanged纳秒大于新值纳秒)。但是,在 Button 单击后,onChanged 日志发生在设置新值之前(onChanged 纳秒小于新值纳秒)。为什么会这样?:

Button 单击之前(onChanged 日志预计会在设置初始值之后发生):

09-06 20:30:47.877 com.example.android.test D/TAG: initial set val ns 102107899222617
    initial get val ns 102107899367096
09-06 20:30:47.882 com.example.android.test D/TAG: onChanged integer 0 ns 102107903996992

单击按钮后(onChanged 记录 意外 发生在设置新值之前):

09-06 20:30:55.372 com.example.android.test D/TAG: onChanged integer 1 ns 102115394178238
09-06 20:30:55.373 com.example.android.test D/TAG: onClick set new val 1 ns 102115394446415

代码

final MutableLiveData<Integer> val = new MutableLiveData<>();
val.setValue(0); // triggers onChanged
Log.d(TAG, "initial set val ns " + System.nanoTime());

tv.setText("" + val.getValue());
Log.d(TAG, "initial get val ns " + System.nanoTime());

val.observe(this, new Observer<Integer>() {
    @Override
    public void onChanged(@Nullable Integer integer) {
        // onChanged happens after initial setValue but before setValue with new value
        Log.d(TAG, "onChanged integer " + integer + " ns " + System.nanoTime());
        tv.setText("" + integer);
    }
});

btn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // setting new value (triggers onChanged but 
        // onChanged happens before setting new value via setValue)
        int newVal = val.getValue() + 1;
        val.setValue(newVal);
        Log.d(TAG, "onClick set new val " + newVal + " ns " + System.nanoTime());
    }
});

正如@pskink 指出的那样,问题在于设置新值的日志位置,MutableLiveValue.setValue() 之前和之后的日志记录清楚地表明:

日志前后添加:

final MutableLiveData<Integer> val = new MutableLiveData<Integer>() {
    @Override
    public void setValue(Integer value) {
        Log.d(TAG, "setValue before");
        super.setValue(value);
        Log.d(TAG, "setValue after");
    }
};

点击 Button 之后(onChanged 日志预计发生在 setValue 之后):

09-06 20:52:02.869 com.example.android.test D/TAG: onClick: before set new val
    setValue before
09-06 20:52:02.870 com.example.android.test D/TAG: onChanged integer 1 ns 103382891472200
    setValue after
    onClick after set new val 1 ns 103382891671576

编辑

之所以在 setValue 之后记录发生在 onChanged 之后,是因为 onChangedsetValue 的某个时刻被调用。