Когда удалять RxJava2 Disposable во ViewModel?

Я использую ViewModel из компонентов архитектуры Android в своем приложении. В ViewModel я использую подписку RxJava2 и сохраняю объект Disposable после подписки. Раньше, когда я делал это в Activity, меня использовали для утилизации Disposable в onDestroy() - чтобы избежать утечек памяти:

@Override
protected void onDestroy() {
    disposable.dispose();
    super.onDestroy();
}

Когда и как я должен утилизировать его в ViewModel? Мне действительно нужно это делать?

14
0
5 428
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

с методом onCleared

@Override
protected void onCleared () {
    disposable.dispose();
    super.onCleared ();
}

Этот метод вызывается только при появлении активности из заднего стека. Этот поток данных лида не удаляется, когда вы открываете второе действие, а первое действие помещается в задний стек.

XIII-th 21.09.2018 11:10

@Sergey Ваша активность может быть уничтожена в любое время, когда она все равно перейдет в фоновый режим, пока ваша активность не будет уничтожена, в большинстве случаев вы определенно не хотите убивать свои потоки данных, иначе, если активность вернется на передний план до того, как будет уничтожена, все ваши потоки будут убит, и, таким образом, ваша активность будет десинхронизирована с вашими данными

Samuel Eminet 21.09.2018 12:00

Я обнаружил, что мне нужно очистить одноразовые предметы в 2-х местах: 1) в oncleared, как указано выше, а также 2) в методе ondestroyview моих фрагментов. >> Если я не очищаю одноразовые предметы согласно пункту 1), мой подписчик срабатывает, когда контекст равен нулю после выхода из представления и сбоя приложения. Если я не очищаюсь согласно пункту 2), у меня возникают проблемы с утечкой памяти, которые, например, вызвали прерывистость в моих прослушивателях щелчков после обратной навигации.

Rowan Gontier 06.03.2020 00:48

@RowanGontier Я никогда не использовал rx на стороне контроллера (фрагменты), я использую rx только из viewmodel и liveata на стороне контроллера, LiveDataReactiveStreams # fromPublisher может быть полезным при преобразовании rx в liveata. Таким образом, вам не нужно удалять на стороне контроллера

Samuel Eminet 06.03.2020 14:30

Вы можете использовать LiveDataReactiveStreams#fromPublisher(Publisher<T>) и выставлять результирующий LiveData из модели представления вместо подписки и удаления в модели представления.

Например:

public class ExampleViewModel {

    private static final long TIME_FOR_ANSWER = 1000;
    private static final long DELAY = 25;

    private final LiveData<Long> remainingTime;

    ExampleViewModel() {
        long start = 0;
        long count = TIME_FOR_ANSWER / DELAY + 1;
        Flowable<Long> flowable =
              Flowable.intervalRange(start, count, 0, DELAY, TimeUnit.MILLISECONDS)
                      .map(i -> TIME_FOR_ANSWER - DELAY * i);
        remainingTime = LiveDataReactiveStreams.fromPublisher(flowable);
    }

    public LiveData<Long> getRemainingTime() {
        return remainingTime;
    }
}

На самом деле я использую здесь Observable.timer. Не могли бы вы посоветовать мне, как его использовать с LiveDataReactiveStreams? Вот код: gist.github.com/micer/93b02625bd078e52c5258eabaaea4449

Micer 04.04.2018 13:19

Кроме того, вот как обрабатывать вращение: stackoverflow.com/q/47382786/1916449

arekolek 04.04.2018 17:48

эй, когда мы используем LiveDataReactiveStreams, он обрабатывает Rx Observation так же, как CompositDisposable?

Yasin Hajilou 19.06.2020 08:40

@yasin Не уверен, что вы имеете в виду, может быть, вы можете опубликовать это как отдельный вопрос и немного уточнить?

arekolek 20.06.2020 12:20

Другие вопросы по теме