Android LiveData, ViewModel, Невозможно добавить одного и того же наблюдателя с разными жизненными циклами - PullRequest
0 голосов
/ 08 октября 2018

Я новичок в компонентах архитектуры Android и пытаюсь использовать LiveData в своей деятельности и MyLifecycleService, но иногда приложение зависает с

IllegalArgumentException: Невозможно добавить одного и того же наблюдателя с разными жизненными циклами

вот мой код в сервисе

 private final MutableLiveData<SocketStatus> socketStatusMutableLiveData = OrderRxRepository.Companion.getInstance().getMldSocketStatus(); 
 socketStatusMutableLiveData.observe(this, socketStatus -> {
        if (socketStatus == null) return;
        ...
    });

для моей деятельности у меня есть класс ActivityViewModel, который содержит те же данные, вот код

class MyActivityViewModel: ViewModel() {
val socketStatusMutableLiveData = OrderRxRepository.instance.mldSocketStatus
}

икод в моей деятельности

MyActivityViewModel viewModel = ViewModelProviders.of(this).get(MyActivityViewModel .class);
viewModel.getSocketStatusMutableLiveData().observe(this, socketStatus -> {
        if (socketStatus == null) return;
        ...
    });

1 Ответ

0 голосов
/ 09 октября 2018

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 - замечательно, если вы хотите также убедиться, что ваша деятельность активна после завершения вашего обслуживания
...