tl; др Вы не можете позвонить LiveData.observe()
с двумя разными LifecycleOwner
с.В вашем случае ваша активность - одна LifecycleOwner
, а другая - ваша служба.
Из исходного кода Android вы можете видеть, что это исключение выдается, если уже есть LifecyclerOwner
наблюдения и что LifecyclerOwner
отличается от того, с которым вы пытаетесь наблюдать.
public void observe(@NonNull LifecycleOwner owner, @NonNull Observer<T> observer) {
...
LifecycleBoundObserver wrapper = new LifecycleBoundObserver(owner, observer);
ObserverWrapper existing = mObservers.putIfAbsent(observer, wrapper);
if (existing != null && !existing.isAttachedTo(owner)) {
throw new IllegalArgumentException("Cannot add the same observer"
+ " with different lifecycles");
}
...
}
Это объясняет, почему у вас возникла эта проблема, так как вы пытаетесь наблюдать на тех же LiveData с действием (которое является одним LifecycleOwner
)и Служба (другая LifecycleOwner
).
Большая проблема в том, что вы пытаетесь использовать LiveData для чего-то, что не предназначалось для этого.LiveData
предназначен для хранения данных для одного LifecycleOwner
, в то время как вы пытаетесь заставить его хранить данные для нескольких LifecycleOwner
.
Вам следует рассмотреть другие варианты решения проблемы, которую вы пытались решить с помощью LiveData
.Вот некоторые альтернативы в зависимости от ваших потребностей:
- Глобальный синглтон - отлично, если вы хотите сохранить некоторые данные в памяти и иметь их в любом месте вашего приложения.Используйте его с Rx, если вы хотите, чтобы ваши данные были "наблюдаемыми"
- LocalBroadcastManager - отлично, если вы хотите общаться между вашим сервисом и деятельностью
- Intent - замечательно, если вы хотите также убедиться, что ваша деятельность активна после завершения вашего обслуживания