Room android LiveData наблюдать за звонком только 2 раза - PullRequest
0 голосов
/ 22 марта 2020

У меня проблема с использованием LiveData в библиотеке комнат android.

У меня есть фрагмент, где есть RecyclerView, и для заполнения используйте LiveData с Observer

mDB.user().getUsers().observe(getViewLifecycleOwner(), new Observer<List<UserModel>>() {
        @Override
        public void onChanged(List<UserModel> userModels) {
            updateUI(userModels);
        }
});

Если я нажму на кнопку ДОБАВИТЬ, вызову startActivity, открою новую активность с моей формой, скомпилирую все поля и @INSERT новый элемент в БД

AsyncTask.execute(() -> {
        mDB.user().addUser("NAME");
        finish();
});

Когда закончим sh текущая активность, покажите снова предыдущий фрагмент и автоматически вызовите onChanged. observe вызывается только 2 раза, после чего, если я нажимаю кнопку ДОБАВИТЬ (в 3-й раз) и возвращаюсь к фрагменту, никогда не звоню и никогда не обновляю sh мой список. Я не знаю почему.

Я пытался с observeForever безрезультатно.

Я вижу, что в отладке никогда не вызывается removeObserver, поэтому наблюдатель активен.

Это мои зависимости

def room_version = "2.2.5"
def lifecycle_version = "2.3.0-alpha01"

// Room database
implementation "androidx.room:room-runtime:$room_version"
annotationProcessor "androidx.room:room-compiler:$room_version"
// ViewModel
implementation "androidx.lifecycle:lifecycle-viewmodel:$lifecycle_version"
// LiveData
implementation "androidx.lifecycle:lifecycle-livedata:$lifecycle_version"
implementation "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version"
implementation "androidx.lifecycle:lifecycle-service:$lifecycle_version"
implementation "androidx.lifecycle:lifecycle-process:$lifecycle_version"

1 Ответ

0 голосов
/ 23 марта 2020

Вы должны вызывать observe() с onResume() из UsersFragment вместо onCreateView(), потому что для добавления нового пользователя вы переключаетесь на новое действие, которое приостанавливает текущее действие и прикрепленные к нему фрагменты вместо уничтожая взгляды на фрагменты. Поэтому, когда вы возвращаетесь к текущей деятельности, onCreateView() из UsersFragment никогда не вызывается, однако вызывается onResume().

Однако я бы предложил вам реализовать правильную ViewModel, Repository шаблон для связи с Room базой данных.

...