Нужно ли распоряжаться () издателями, созданными с использованием LiveDataReactiveStreams

Допустим, у меня есть Flowable, который используется в разных частях приложения.

В каждом фрагменте, где я хочу это наблюдать, я конвертирую его в LiveData с LiveDataReactiveStreams.fromPublisher, чтобы избежать утечек и сбоев. Теперь у меня есть LiveData, который обертывает мой Flowable.

Затем я передаю LiveData в свою ViewModel (в ViewModelFactory). Насколько я понимаю, я могу продолжать использовать LiveData, не беспокоясь об утечках.

Теперь, вместо того, чтобы напрямую наблюдать за LiveData, у меня возникает соблазн преобразовать его обратно в Flowable с LiveDataReactiveStreams.toPublisher и Flowable.fromPublisher и вместо этого подписаться на Flowable. Теперь это Flowable, который обертывает LiveData, который обертывает Flowable.

Мой вопрос: нужно ли мне беспокоиться об утилизации подписок на этот Flowable? Я надеюсь, что LiveData будет действовать как «барьер», предотвращая утечку моего контекста обратно в корневой Flowable, но я не уверен в этом.

Другими словами:

  1. Flowable A существует в глобальном контексте
  2. В каждом фрагменте A заключена в LiveData B, которая задается как свойство ViewModel фрагментов.
  3. Когда обычно я наблюдаю за LiveData B, я вместо этого оборачиваю его в Flowable C.
  4. Я подписываюсь на Flowable C и игнорирую возвращенные одноразовые

Будут ли представления, доступные в C, перетекать в A, когда фрагмент будет уничтожен?


person Gustav Karlsson    schedule 19.12.2017    source источник


Ответы (1)


Учитывая текущей реализации, вам по-прежнему необходимо вручную управлять подписками. Жизненный цикл используется только для наблюдения за оперативными данными.

mLiveData.observe(mLifecycle, LiveDataSubscription.this);

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

person tynn    schedule 26.12.2017
comment
Я понимаю, что он у меня не отписывается, но у меня такой вопрос: Будет ли он действительно течь при уничтожении фрагмента? Если да, то где/как происходит эта утечка? - person Gustav Karlsson; 26.12.2017
comment
Это приведет к утечке вашей подписки издателю. - person tynn; 26.12.2017
comment
Я с вами до сих пор, но разве издатель не будет GC:ed (вместе с подпиской), когда фрагмент будет GC:ed? Насколько я вижу, все ссылки, созданные здесь, являются циклическими, что должно предотвратить утечку (если я не сделаю что-то явно глупое). - person Gustav Karlsson; 27.12.2017
comment
Если я вас правильно понял, вы, возможно, никогда не соберете фрагмент, если встроите побочные эффекты в поток. Если вы этого не сделаете, ссылка на издателя или одноразовый элемент внутри фрагмента не должна быть даже единственной, и, таким образом, поток останется активным. Вот почему вы всегда должны где-то избавляться от подписки в жизненном цикле Android. - person tynn; 28.12.2017