我遇到来自新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
答案 0 :(得分:2)
LiveData具有生命周期意识。在您的情况下,您正在onCreate中更改其值-活动开始时,liveData将调用其观察者(在这种情况下,恰好一次)。
如果LiveData的生命周期处于STARTED或RESUMED状态,则将其视为由Observer类表示的观察者处于活动状态。 LiveData仅将有关更新的信息通知活动的观察者。注册为观看LiveData对象的非活动观察者不会收到有关更改的通知。 https://developer.android.com/topic/libraries/architecture/livedata