Android, отписка от BehaviorSubject

193
26 октября 2019, 09:20

У меня есть BehaviorSubject, назначение которого - наблюдать за int переменной:

private BehaviorSubject<Integer> source = BehaviorSubject.create();

В onCreate я подписываюсь на него:

source.subscribe(new Observer<Integer>() {
            @Override
            public void onCompleted() {
            }
            @Override
            public void onError(Throwable e) {
            }
            @Override
            public void onNext(Integer integer) {
                itemCounter.setText(getString(R.string.catalog_items_founded, integer));
            }
        });

И в коде вызываю sourse.onNext(value) неопределённое количество раз.

Судя по тому что я читал о RxJava, по завершению жизни Activity мне нужно от sourse отписаться чтобы на Activity не вели ссылки, но как это сделать? У sourse нет для этого метода, у Observer тоже, если его создавать не анонимно. Где - то я читал что можно обойтись просто source.onCompleted(); но я не уверен в этом.

Answer 1

Метод subscribe возвращает объект Subscription или Disposable в зависимсоти от используемой версии rxJava. У этого объекта есть метод unsubscribe или dispose. Именно их и нужно использовать.

Если у вас на несколько источников идёт подписка, то можно воспользоваться контейнерами для подписок CompositeSubscription или CompositeDisposable. У них есть методы add и clear для добавления подписок и очистки контейнеров, с одновременной отпиской от источников.

Как только вы отпишетесь ссылки на источники и на активити станут доступны для очистки сборщиком мусора и возможная проблема будет решена.

В вашем случае код должен быть примерно таким (код для 2 rxJava):

  1. В активити создаёте контейнер для подписок:

    private CompositeDisposable compositeDisposable = new CompositeDisposable();
    
  2. При создании подписки кладите её в контейнер:

    compositeDisposable.add(source.subscribe(observer));
    
  3. В нужном методе жизненного цикла очищайте контейнер. В вашем случае, видимо, в onDestroy, хотя, возможно, вам лучше бы подошли бы onResume/onPause или onStart/onStop:

    @Override
    public void onDestroy() {
        super.onDestroy();
        compositeDisposable.clear();
    }
    
READ ALSO
Связь между JPA, Spring data jpa и Hibernate

Связь между JPA, Spring data jpa и Hibernate

Hibenate - одна из реализация JPAJPA - это только спецификация

218
invalid type code:AC

invalid type code:AC

Пробую сериализовать обьектИдея такая: Есть класс HA(что-то типа человека) у него есть поля 1)Имя 2)Что делает 3)Id 4)Дата и есть методы 1)write 2)read...

261
java как сделать таймер [закрыт]

java как сделать таймер [закрыт]

Я хотел бы чтоб проще говоря у меня был таймер который после 1 минуты выполнял часть кода , допустим прибавлял к одной переменной еще 5 , и после...

159
Период у вещественных чисел

Период у вещественных чисел

Поддерживается ли в java бесконечные периодические дроби? Например, что будет при делении 86 на 30?

124