Я использую ViewModel из компонентов архитектуры Android в своем приложении. В ViewModel я использую подписку RxJava2 и сохраняю объект Disposable после подписки. Раньше, когда я делал это в Activity, меня использовали для утилизации Disposable в onDestroy() - чтобы избежать утечек памяти:
@Override
protected void onDestroy() {
disposable.dispose();
super.onDestroy();
}
Когда и как я должен утилизировать его в ViewModel? Мне действительно нужно это делать?
с методом onCleared
@Override
protected void onCleared () {
disposable.dispose();
super.onCleared ();
}
@Sergey Ваша активность может быть уничтожена в любое время, когда она все равно перейдет в фоновый режим, пока ваша активность не будет уничтожена, в большинстве случаев вы определенно не хотите убивать свои потоки данных, иначе, если активность вернется на передний план до того, как будет уничтожена, все ваши потоки будут убит, и, таким образом, ваша активность будет десинхронизирована с вашими данными
Я обнаружил, что мне нужно очистить одноразовые предметы в 2-х местах: 1) в oncleared, как указано выше, а также 2) в методе ondestroyview моих фрагментов. >> Если я не очищаю одноразовые предметы согласно пункту 1), мой подписчик срабатывает, когда контекст равен нулю после выхода из представления и сбоя приложения. Если я не очищаюсь согласно пункту 2), у меня возникают проблемы с утечкой памяти, которые, например, вызвали прерывистость в моих прослушивателях щелчков после обратной навигации.
@RowanGontier Я никогда не использовал rx на стороне контроллера (фрагменты), я использую rx только из viewmodel и liveata на стороне контроллера, LiveDataReactiveStreams # fromPublisher может быть полезным при преобразовании rx в liveata. Таким образом, вам не нужно удалять на стороне контроллера
Вы можете использовать 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
Кроме того, вот как обрабатывать вращение: stackoverflow.com/q/47382786/1916449
эй, когда мы используем LiveDataReactiveStreams, он обрабатывает Rx Observation так же, как CompositDisposable?
@yasin Не уверен, что вы имеете в виду, может быть, вы можете опубликовать это как отдельный вопрос и немного уточнить?
Этот метод вызывается только при появлении активности из заднего стека. Этот поток данных лида не удаляется, когда вы открываете второе действие, а первое действие помещается в задний стек.