Java 为什么在进行数据更改之前调用LiveData onChanged?
上下文 使用Java 为什么在进行数据更改之前调用LiveData onChanged?,java,android,android-livedata,mutablelivedata,Java,Android,Android Livedata,Mutablelivedata,上下文 使用MutableLiveData保存值按钮单击应增加值 问题 MutableLiveData的Observer.onChanged()似乎是在使用MutableLiveData.setValue()更改值之前调用的 例如,在按钮单击之前,onChanged日志发生在初始值设置之后(onChanged纳秒大于新值纳秒)。但是,单击按钮后,onChanged日志在设置新值之前发生(onChanged纳秒小于新值纳秒)。为什么会发生这种情况 在按钮之前单击(onChangedlog预期在设置
MutableLiveData
保存值<代码>按钮单击应增加值
问题
MutableLiveData
的Observer.onChanged()
似乎是在使用MutableLiveData.setValue()
更改值之前调用的
例如,在按钮
单击之前,onChanged
日志发生在初始值设置之后(onChanged
纳秒大于新值纳秒)。但是,单击按钮后,onChanged
日志在设置新值之前发生(onChanged
纳秒小于新值纳秒)。为什么会发生这种情况
在按钮之前
单击(onChanged
log预期在设置初始值后发生):
单击按钮后(onChanged
log在设置新val之前意外发生):
代码
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());
}
});
final MutableLiveData val=new MutableLiveData();
val.setValue(0);//触发器一经更改
Log.d(标记“初始设置值ns”+System.nanoTime());
tv.setText(“+val.getValue());
Log.d(标记“initialgetvalns”+System.nanoTime());
val.observe(这个,新的观察者(){
@凌驾
公共void onChanged(@Nullable Integer){
//onChanged发生在初始setValue之后,但在具有新值的setValue之前
Log.d(标记“onChanged integer”+integer+“ns”+System.nanoTime());
tv.setText(“+”整数);
}
});
btn.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
//设置新值(触发器一旦更改,但
//onChanged发生在通过setValue设置新值之前)
int newVal=val.getValue()+1;
val.setValue(newVal);
Log.d(标记“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");
}
};
编辑
setValue
之后的日志记录发生在onChanged
之后的原因是onChanged
在setValue
调用Log.d(标记,“onClick set new val”+newVal+“ns”+System.nanoTime())的某个点被调用调用val.setValue(newVal)前的code>
@pskink很有意义,只是想澄清一下,onChanged
是在setValue
之后发生的,谢谢,这样你会发现一个时间机器,当灯泡在你关掉之前就熄灭了;-)@pskink很好的类比;)另外,要结束这个问题,我应该添加编辑作为答案,还是不需要接受答案?你可以自己写一个答案
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());
}
});
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");
}
};
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