我正在使用Android应用中的ViewModels
和LiveData
,并且即使屏幕旋转时,我也想使用它们来跟踪活动的数据。这工作得很好,但是有一个我无法解决的问题。在Activity的onCreate
方法中,我为包含对象列表的LiveData注册了一个观察者,如果加载了数据,则应在活动中添加一个Fragment。然后,我仅在savedInstanceState
为null的情况下重新加载数据,这将阻止屏幕旋转时重新加载数据。看起来像这样:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
model = ViewModelProviders.of(this).get(MainActivityModel.class);
observeList();
if (savedInstanceState == null) {
loadList(); //Reload the list and call postValue() on the LiveData.
}
}
private void observeList() {
model.getList().observe(this, new Observer<ArrayList<Object>>(){
@Override
public void onChanged(@Nullable ArrayList<Object> objects) {
//Add list fragment whenever data changes.
getSupportFragmentManager().beginTransaction()
.replace(R.id.container, ListFragment.getInstance(list))
.commit();
}
});
}
据我了解,ListFragment仅应在数据更改时显示。但是,经过一些调试后,似乎每次旋转屏幕时都会调用observeList方法中的onChanged
方法。另外,我检查了实际列表是否已更改,并且是否完全相同,没有任何区别,甚至从未进行过postValue(
)或setValue()
方法调用。因此,我不知道为什么屏幕旋转时会调用onChanged方法。
这也仅在列表包含某些内容时发生。启动应用程序时,列表的长度为0,然后调用loadList()
。在此状态下注册观察者时,不会调用onChanged方法。
我的最佳猜测是,onChanged
方法被触发是因为注册观察者时列表不为空,因此观察者可能认为数据发生了变化。谁能解释为什么会这样?
答案 0 :(得分:1)
这按预期工作。来自livedata overview:
确保活动或片段具有可在活动后立即显示的数据。一旦应用程序组件处于“开始”状态,它就会从其正在观察的LiveData对象中接收最新值。仅当已设置要观察的LiveData对象时,这种情况才会发生。
尽管缺少代码段-loadList
应该是ViewModel本身的一部分,而不是活动的方法。