J'utilise ViewModel à partir de composants d'architecture Android dans mon application. Dans le ViewModel, j'utilise RxJava2 subscription et je conserve l'objet Disposable
après ma souscription. Avant, quand je faisais cela dans Activity
, j'avais l'habitude de jeter la Disposable
dans onDestroy()
- pour éviter les fuites de mémoire:
@Override
protected void onDestroy() {
disposable.dispose();
super.onDestroy();
}
Quand et comment devrais-je le jeter dans ViewModel
? Ai-je réellement besoin de faire ça?
avec la méthode onCleared
@Override
protected void onCleared () {
disposable.dispose();
super.onCleared ();
}
Vous pouvez utiliser LiveDataReactiveStreams#fromPublisher(Publisher<T>)
et exposer LiveData
résultant du modèle de vue au lieu de vous abonner et de disposer dans le modèle de vue.
Par exemple:
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;
}
}
Vous devriez le faire dans onPause()
car onDestroy()
est appelé uniquement lorsque Activity
ou Fragment
est détruit. Il peut vivre sur la pile lorsque vous ajoutez une nouvelle vue à celle-ci et continuez à recevoir des données de votre ViewModel
, mais onPause()
doit être appelé lorsque la vue n'est pas à l'écran.