Итак, я работаю над своим первым приложением viewModel, оно должно издавать звук с чем-то вроде ...

MediaPlayer.create(context, R.raw.app_start).start()

Но для этого требуется контекст, если я правильно понимаю, что код viewModel не должен ссылаться на контекст, чтобы избежать утечек памяти, поэтому мне нужен мой фрагмент для выполнения кода.

Чтобы вызвать звук во фрагменте из кода viewModel, я мог бы определить наблюдателя состояния на логическом значении и перевернуть его состояние в viewModel, чтобы выполнить код во фрагменте, но это кажется беспорядочным, поскольку мне пришлось бы перевернуть его дважды, чтобы он был готов для следующей потребности в звуке.

Есть способ более элегантный?

0
dave selby 2 Май 2021 в 15:24

1 ответ

Лучший ответ

Хм. Что ж, используя наблюдаемое, вы только что столкнулись с классической проблемой «наблюдения за событием». Стандартное использование наблюдаемых Google - это значение (состояние), и, как вы заметили, у вас есть проблема с необходимостью «сбросить» значение (публикация того же значения не уведомляет наблюдателей).

Есть много способов обойти это, но в зависимости от ваших потребностей быстрое (на самом деле немного хакерское IMHO) решение - использовать временную метку (возможно, значение времени в миллисекундах) в качестве триггера. Каждый раз, когда вы нажимаете значение, оно будет другим и будет отображаться во фрагменте.

В большинстве подобных случаев вам не важно значение, это просто триггер ... в данном случае для воспроизведения звука ... но с тем же успехом это может быть выход из фрагмента или что-то еще.

1
C B J 2 Май 2021 в 13:37