У меня есть 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(); но я не уверен в этом.
Метод subscribe возвращает объект Subscription или Disposable в зависимсоти от используемой версии rxJava. У этого объекта есть метод unsubscribe или dispose. Именно их и нужно использовать.
Если у вас на несколько источников идёт подписка, то можно воспользоваться контейнерами для подписок CompositeSubscription или CompositeDisposable. У них есть методы add и clear для добавления подписок и очистки контейнеров, с одновременной отпиской от источников.
Как только вы отпишетесь ссылки на источники и на активити станут доступны для очистки сборщиком мусора и возможная проблема будет решена.
В вашем случае код должен быть примерно таким (код для 2 rxJava):
В активити создаёте контейнер для подписок:
private CompositeDisposable compositeDisposable = new CompositeDisposable();
При создании подписки кладите её в контейнер:
compositeDisposable.add(source.subscribe(observer));
В нужном методе жизненного цикла очищайте контейнер. В вашем случае, видимо, в onDestroy, хотя, возможно, вам лучше бы подошли бы onResume/onPause или onStart/onStop:
@Override
public void onDestroy() {
super.onDestroy();
compositeDisposable.clear();
}
Сборка персонального компьютера от Artline: умный выбор для современных пользователей