Android: LiveData observeForever приводит к сбою, потому что представления равны нулю

#android #android-livedata #lifecycle

#Android #android-livedata #жизненный цикл

Вопрос:

Для целей моего приложения у меня есть текущие данные, которые observesForEver и обновляют представления. Когда я выхожу из приложения в фоновый режим и возвращаюсь на передний план, приложение выходит из строя в представлениях, которые находятся в наблюдателях.

Вот сбой:

E / AndroidRuntime: ФАТАЛЬНОЕ ИСКЛЮЧЕНИЕ: основной процесс: com.emoona.music, PID: 7897 java.lang.Исключение NullPointerException: this.titleTxt не должен быть нулевым в com.emoona.torahboxmusic.features.playmusic.playlist.Выберите playlistfragment.updateUI(SelectPlaylistFragment.kt:157) …………….

Мой код:

 viewModel.globalController.music.observeForever { music ->
            val music = music ?: return@observeForever
            this.titleTxt.text = music.title
        }
  

Я объявляю наблюдателя на onViewCreated

Что мне следует сделать, чтобы избежать этого сбоя? Почему представления равны нулю в наблюдателе?

Я указываю, что не хочу делать observe(viewLifeCycle) , потому что мне это нужно observeForEver

Комментарии:

1. Ваш сбой происходит из-за того, что вы используете observeForever . Что заставляет вас думать, что вам нужно использовать observeForever ?

2. В некоторых случаях у меня открыто действие на фрагменте, и это действие должно уведомлять наблюдателя о новом значении. Если я установлю его в simple observe , наблюдатель не будет уведомлен об активности на нем.

3. Не могли бы вы быть более конкретными, пожалуйста. Что вы имеете в виду под активностью, открытой для фрагмента? Вы имеете в виду наоборот? Какова ваша логика: например, activity, у которого есть фрагмент, и это действие уведомляет наблюдателя на fragmetn о том, что что-то новое? Нам нужно больше информации, чтобы помочь вам (то есть больше кода)

4. нет, я имею в виду, что у меня есть действие, содержащее фрагмент, и из этого фрагмента я открываю новое действие, и это новое действие должно уведомлять наблюдателя о фрагменте позади. Фрагмент и действие имеют общий менеджер, который содержит поле livedata, которое позволяет одному (фрагменту) наблюдать, а другому уведомлять (активность)

5. this.titleTxt убедитесь, что ваш titleTxt правильно инициализирован перед установкой текста