Почему LiveData Observer вызывается слишком много раз? - PullRequest
0 голосов
/ 11 февраля 2019

Я использую Android LiveData с базой данных Room.Все работает нормально, но единственное, что LiveData обозреватель вызывается слишком много раз.Я инициализировал ViewModel внутри функции Activity onCreate.Пожалуйста, просмотрите мои коды и если я сделал что-то не так.Спасибо

viewModel = ViewModelProviders.of(this).get(PersonListViewModel.class);
viewModel.getAll().observe(this, personList->{
    Log.e("PersonRecycler", "Observer called");

    if (personList.size() == 0) {
        lytNoPerson.setVisibility(View.VISIBLE);
    } else {
        lytNoPerson.setVisibility(View.GONE);
        adapterData.resetData(personList);
    }
});

Я ожидал, что этот наблюдатель вызвал только один раз при первой загрузке.И звонил снова всякий раз, когда у меня есть новые обновления.Но он звонит много раз при первой загрузке.Пожалуйста, проверьте этот скриншот ниже.Еще раз спасибо.

http://prntscr.com/mjg7dw

Ниже приведен исходный код ViewModel.

public class PersonListViewModel extends AndroidViewModel {
    private PersonRepository repository;

    private MutableLiveData<List<Person>> personList;
    private MediatorLiveData<List<Person>> liveDataMerger;

    public PersonListViewModel(@NonNull Application application) {
        super(application);

        repository = PersonRepository.getInstance(application);

        personList = new MutableLiveData<>();
        liveDataMerger = new MediatorLiveData<>();
    }

    public LiveData<List<Person>> getAll() {
        String createdBy = AppController.getInstance().firebaseUser.getEmail();
        return repository.getAll(createdBy);
    }

    public LiveData<PagedList<Person>> getPagedPerson() {
        return repository.getPagedPerson();
    }

    public LiveData<List<Person>> loadMore(int page) {
        /*
        LiveData<List<Person>> pList = repository.getPersonByPage(page);
        liveDataMerger.addSource(pList, list->{
            liveDataMerger.setValue(list);
        });

        return liveDataMerger;
        */
        return repository.getPersonByPage(page);
    }

    public MutableLiveData<List<Person>> getPersonList() {
        return personList;
    }
}

Это функция getAll в хранилище.

public LiveData<List<Person>> getAll(String createdBy) {
        return database.personDao().getAll(createdBy);
    }

Этоэто функция getAll в Дао

@Query("SELECT * FROM " + TABLE_PERSON + " WHERE deleted=0 AND createdBy=:createdBy ORDER BY created DESC")
LiveData<List<Person>> getAll(String createdBy);
...