Я работаю с 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
также запускается, потому что список не пуст, когда наблюдатель зарегистрирован, чтобы наблюдатель могдумаю, что есть изменение в данных.Кто-нибудь может объяснить, почему это может происходить?