Привет, ребята, это моя первая история на Medium, и я очень рад, что узнал что-то захватывающее, чем могу с вами поделиться.

Я пытаюсь создать образец, реализующий чистую архитектуру с помощью MVVM. Мой образец очень простой. Мы можем изменить размер текста, прокрутив SeekBar, изменить цвет текста и цвет фона TextView, прикоснувшись к ColorPicker, а затем сохранить информацию TextView (размер текста, цвет текста, цвет фона) при нажатии кнопки «Применить». После этого Toast покажет сообщение, чтобы уведомить, была ли информация сохранена успешно или нет. Ниже представлен мой образец :).

В ViewModel я объявляю сообщение MutableLiveData ‹String›, которое будет изменено после завершения сохранения задачи. Действие будет отслеживать изменение сообщения MutableLiveData ‹String›, чтобы сделать тост. Это работает хорошо, но когда я поворачиваю экран, снова появляется сообщение Toast, хотя я не выполняю сохранение. Это правильно, потому что это дизайн LiveData (уведомить активных наблюдателей).

Это мой код ViewModel:

Это мой код активности:

Итак, я хочу найти способ, чтобы сообщение отображалось только при изменении. И я прочитал рассказ Jose Alcérreca об SingleLiveData. Эта история полезна. Но я думаю, что будет способ попроще. Итак, я прочитал больше исходный код LiveData и обратил внимание на метод рассмотретьNotify (ObserverWrapper Observer).

Это код метода thinkNotify (наблюдатель ObserverWrapper):

Обратите внимание на строчки 14–16:

Наблюдатель получит уведомление, когда последняя версия будет меньше текущей версии LiveData. Это натолкнуло меня на мысль, почему бы нам не создать ObserverWrapper, который сохранит версию, которая будет такой же, как текущая версия LiveData при создании, и сравнить версию LiveData с версией ObserverWrapper, чтобы выбрать метод onChange () обернутого Observer будет вызываться или нет.

Для этого нам нужно получить текущую версию LiveData, чтобы установить версию для ObserverWrapper при построении ObserverWrapper. И я вижу, что LiveData предоставляет нам метод getVersion (), но мы можем получить доступ к этому методу только при создании класса с тем же именем пакета LiveData. Это не усложняет нам задачу, просто создайте новый класс с именем пакета, таким же, как LiveData (android.arch.lifecycle), и мы сможем получить доступ к методу getVersion () LiveData. Итак, у нас достаточно условий для создания класса EventLiveData.

Это код моего EventLiveData:

И это код моей модели ViewModel при использовании EventLiveData:

И это код моей Activity при использовании EventLiveData:

Вы все можете видеть, что различий не так много, и это все, чем я хочу с вами поделиться :). Мой английский не очень хороший, но я думаю, вы все поймете, что я пишу, верно ?!

Спасибо, что прочитали мой первый рассказ, это мой образец источника.

Удачи и хорошей дневной работы !!