我对来自新 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