Как обеспечить GC при подписке на наблюдаемые - PullRequest
0 голосов
/ 02 мая 2018

У меня есть класс, который принимает Observable и подписывается на него.

static class Helper {
    void subscribeTo(Observable<Object> observable) {
        observable.subscribe(someObject -> {
            // do something with someObject;
        });
    }
}

Есть ли способ, что этот класс сам может быть уверен, что он отменит подписку при установке на null?

void main() {
    Helper helper = new Helper();
    Observable<Object> observable = ... // an observable that never completes
    helper.subscribeTo(observable);

    ...

    helper = null; // helper will never be GC'd because observable never completes
}

В этом примере Helper очень легко злоупотребить, если вы дадите ему бесконечный Observable.

Лучшее решение, которое я могу придумать, это разрешить (но не принудительно) экземпляру класса очищает вспомогательный класс перед установкой на нуль:

static class Helper {

    private Disposable disposable;

    void subscribeTo(Observable<Object> observable) {
        // do something with someObject;
        disposable = observable.subscribe(someObject -> {
            // do something with someObject;
        });
    }

    void cleanup() {
        disposable.dispose();
    }
}

void main() {
    Helper helper = new Helper();
    Observable<Object> observable = ... // an observable that never completes
    helper.subscribeTo(observable);

    ...

    helper.cleanup();
    helper = null;
}

1 Ответ

0 голосов
/ 02 мая 2018

Вам придется полагаться на пользователя, чтобы как-то отписаться. Почему бы просто не передать их обратно disposable и позволить им это использовать?

static class Helper {
    Disposable subscribeTo(Observable<Object> observable) {
        return observable.subscribe(someObject -> {
            // do something with someObject;
        });
    }
}
...