即使数据没有变化,LiveData观察者的onChanged也会在活动轮换上被调用

时间:2019-02-08 12:49:34

标签: android viewmodel android-livedata

我正在使用Android应用中的ViewModelsLiveData,并且即使屏幕旋转时,我也想使用它们来跟踪活动的数据。这工作得很好,但是有一个我无法解决的问题。在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方法被触发是因为注册观察者时列表不为空,因此观察者可能认为数据发生了变化。谁能解释为什么会这样?

1 个答案:

答案 0 :(得分:1)

这按预期工作。来自livedata overview

  

确保活动或片段具有可在活动后立即显示的数据。一旦应用程序组件处于“开始”状态,它就会从其正在观察的LiveData对象中接收最新值。仅当已设置要观察的LiveData对象时,这种情况才会发生。

尽管缺少代码段-loadList应该是ViewModel本身的一部分,而不是活动的方法。