LiveData в фоновых потоках или не-пользовательские компоненты - PullRequest
0 голосов
/ 23 января 2019

Dears. Раньше я разрабатывал приложения для Android с использованием шаблона MVP, а сейчас пробую MVVM с такими компонентами архитектуры, как DataBind и LiveData.

Я написал свой класс репозитория, который предоставляет LiveData:

LiveData<MyEntity> getById(long id);

Для действия / фрагментов я наблюдаю данные LiveData, предоставляемые ViewModel (который использует мой репозиторий), и все работает нормально.

Проблема в том, что мне нужно запланировать Тревогу для отображения Уведомления с текстом, связанным с MyEntity, поэтому я создал Intent, содержащий MyEntityId в качестве Extra.

Когда AlarmManager вызывает мой BroadcastReceiver, мне нужно использовать репозиторий для получения MyEntity. Дело в том, как «наблюдать» LiveData внутри компонента, не являющегося пользовательским интерфейсом.

Кроме того, я могу запустить IntentService (фоновый поток), чтобы избежать доступа к репозиторию в главном потоке, и использовать что-то вроде «blockingNext» из RxJava, но я все еще не мог найти способ ждать LiveData.

Как правильно это сделать? Обратите внимание, что мой репозиторий не может быть реализован с использованием Room из-за устаревших проблем.

Спасибо

Единственное решение, которое я до сих пор считал, было иметь такие методы в репозитории:

LiveData<MyEntity> getByIdLive(long id);
MyEntity getById(long id);

Но это не выглядит хорошо для меня. Поэтому я хотел бы спросить, как правильно реализовать это.

С наилучшими пожеланиями

1 Ответ

0 голосов
/ 23 января 2019

Вы можете наблюдать только liveData в таких компонентах пользовательского интерфейса, как Activity / Fragment.

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

, чтобы прочитать о наблюдателе: https://developer.android.com/reference/java/util/Observer

о EventBus: https://github.com/greenrobot/EventBus

...