2

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

1 回答 1

2

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

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

于 2018-06-20T10:15:46.413 回答