web-dev-qa-db-fra.com

Quand jeter RxJava2 dans le ViewModel?

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?

7
Micer

avec la méthode onCleared

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

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;
    }
}
1
arekolek

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.

0