Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/224.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么在进行数据更改之前调用LiveData onChanged?_Java_Android_Android Livedata_Mutablelivedata - Fatal编程技术网

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