与ObservableField相比,奇怪的LiveData行为

时间:2017-10-20 11:58:11

标签: android android-architecture-components android-architecture-lifecycle

我遇到来自新Android架构组件的LiveData问题。我之前使用过ObservableField,但想尝试使用ACC。

当我在Activity中的一个方法中通过MutableLiveData.setValue设置4次值时,我只得到一次调用onChange,当我使用ObservableField时它会按预期工作 - 它会回调4次。

为什么LiveData没有为每个setValue命中onChange?

视图模型:

public class MainViewModel extends AndroidViewModel {

MutableLiveData<Boolean> booleanMutableLiveData;
ObservableField<Boolean> booleanObservableField;

public MainViewModel(@NonNull Application application) {
    super(application);
    booleanMutableLiveData = new MutableLiveData<>();
    booleanObservableField = new ObservableField<>();
}

public void changeBool()
{
    booleanMutableLiveData.setValue(false);
    booleanObservableField.set(false);
    booleanMutableLiveData.setValue(true);
    booleanObservableField.set(true);
    booleanMutableLiveData.setValue(false);
    booleanObservableField.set(false);
    booleanMutableLiveData.setValue(true);
    booleanObservableField.set(true);
}
}

活动:

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    final MainViewModel mainViewModel = ViewModelProviders.of(this).get(MainViewModel.class);

    mainViewModel.booleanMutableLiveData.observe(this, new Observer<Boolean>() {
        @Override
        public void onChanged(@Nullable Boolean aBoolean) {
            Log.e("Mutable Value", String.valueOf(aBoolean));
        }
    });

    mainViewModel.booleanObservableField.addOnPropertyChangedCallback(new Observable.OnPropertyChangedCallback() {
        @Override
        public void onPropertyChanged(Observable sender, int propertyId) {
            Log.e("Observable value", String.valueOf(mainViewModel.booleanObservableField.get()));
        }
    });

    mainViewModel.changeBool();

}
}

堆栈跟踪:

10-20 13:34:17.445 1798-1798/com.example.livedatasample E/Observable value: false
10-20 13:34:18.588 1798-1798/com.example.livedatasample E/Observable value: true
10-20 13:34:19.336 1798-1798/com.example.livedatasample E/Observable value: false
10-20 13:34:19.994 1798-1798/com.example.livedatasample E/Observable value: true
10-20 13:34:20.892 1798-1798/com.example.livedatasample E/Mutable Value: true

1 个答案:

答案 0 :(得分:2)

LiveData具有生命周期意识。在您的情况下,您正在onCreate中更改其值-活动开始时,liveData将调用其观察者(在这种情况下,恰好一次)。

  

如果LiveData的生命周期处于STARTED或RESUMED状态,则将其视为由Observer类表示的观察者处于活动状态。 LiveData仅将有关更新的信息通知活动的观察者。注册为观看LiveData对象的非活动观察者不会收到有关更改的通知。   https://developer.android.com/topic/libraries/architecture/livedata