OnChanged обозревателя LiveData вызывается при ротации активности, хотя в данных не было никаких изменений - PullRequest
0 голосов
/ 08 февраля 2019

Я работаю с ViewModels и LiveData в приложении для Android, и я хочу использовать их для отслеживания данных для Activity, даже когда экран поворачивается.Это работает довольно хорошо, но есть одна проблема, которую я не могу исправить.В методе действия onCreate я регистрирую наблюдателя для LiveData, содержащего список объектов, который должен просто добавить фрагмент к действию, если данные загружены.Затем я перезагружаю данные только в том случае, если значение savedInstanceState равно нулю, что должно помешать его перезагрузке в случае поворота экрана.Это выглядит так:

    @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 должен отображаться только при изменении данных.Однако после некоторой отладки кажется, что метод onChanged в методе наблюдаемых вызывается каждый раз при повороте экрана.Кроме того, я проверил, был ли изменен фактический список, и он был точно таким же, никакой разницы вообще, и никогда не было даже вызова методов postValue() или setValue().Поэтому я понятия не имею, почему метод onChanged будет вызываться при повороте экрана.

Это также происходит только тогда, когда список содержит что-то.Когда приложение запускается, список имеет длину 0 до вызова loadList().Когда наблюдатель зарегистрирован в этом состоянии, метод onChanged не вызывается.

Мое лучшее предположение состоит в том, что метод onChanged также запускается, потому что список не пуст, когда наблюдатель зарегистрирован, чтобы наблюдатель могдумаю, что есть изменение в данных.Кто-нибудь может объяснить, почему это может происходить?

1 Ответ

0 голосов
/ 08 февраля 2019

Это работает как задумано.Из обзора жизненных данных :

Чтобы убедиться, что у действия или фрагмента есть данные, которые они могут отобразить, как только станут активными.Как только компонент приложения находится в состоянии STARTED, он получает самое последнее значение от объектов LiveData, которые он наблюдает.Это происходит только в том случае, если был установлен объект LiveData для наблюдения.

Несмотря на отсутствие фрагментов кода - loadList должен быть частью самого ViewModel, а не методом действия.

...