CompositeDisposable.clear () не останавливает выполнение Observable - PullRequest
2 голосов
/ 05 августа 2020

Я использую CompositeDisposable для наблюдения за сетевым вызовом. Наблюдаемый находится внутри класса, который использует мой контекст активности, поэтому даже после вызова clear () в onDestroy () наблюдаемый продолжает работать, а его класс содержит ссылку на мою активность, вызывающую утечку памяти. Есть ли способ остановить процесс, а не просто перестать наблюдать за ним?

Класс с Observable

    public ProgressObservable(Context context) {
        super(context);
        createProgressObservable();
    }

    private void createProgressObservable() {
        progressObservable = authenticationObservable
                .flatMap((Function<Object, Observable<ProgressResponse>>)
                        Response -> Observable.fromCallable(() -> {
                            ...
                            ...
                            return pResponse;
                        })).cache();
    }

Создание наблюдаемого в моем Activity

        Observable<ProgressResponse> prObservable = new ProgressObservable(context).getProgressObservable();
        disposable.add(prObservable
                .subscribe(progress -> mListener.onSilentRefreshComplete(),
                        error -> {
                        }));

    @Override
    public void onDestroy() {
        super.onDestroy();
        if (isFinishing()) {
            disposables.clear();
        }
    }

1 Ответ

1 голос
/ 06 августа 2020

Реквизит u / bleeding182 из Reddit, он указал на проблему, которая заключалась в использовании .cache(). Из документации

  • Вы жертвуете возможностью удаления источника при использовании {@code cache} Observer, поэтому будьте осторожны и не используйте этот Observer для ObservableSources, которые генерируют бесконечное или очень большое количество элементов, которые будут использовать память.
...