una tinder suscripciones suscripcion plus play pantaya pantalla eliminar cuenta como celular cancelar android rx-java reactive-programming rx-android

android - tinder - pantalla cancelar suscripcion



Cuándo cancelar la suscripción de una suscripción (3)

Tengo una pregunta sobre cómo cancelar la suscripción de un observable. Tengo dos códigos y no estoy muy seguro de cuál es mejor.

Ejemplo 1 -> Anular la suscripción del suscriptor una vez que la secuencia haya finalizado:

Subscriber<String> subscriber = new Subscriber<String>() { @Override public void onCompleted() { progressdialog.dissmiss(); unsubscribe(); } @Override public void onError(Throwable e) { progressdialog.dissmiss(); } @Override public void onNext(String s) { // do something with data } }

Ejemplo 2 -> Anular la suscripción de la suscripción una vez que se destruye la actividad:

private void test(){ Subscriber<String> subscriber = new Subscriber<String>() { @Override public void onCompleted() { progressdialog.dissmiss(); } @Override public void onError(Throwable e) { progressdialog.dissmiss(); } @Override public void onNext(String s) { // do something with data } }; subscription = BackendRequest.login(loginRequest) .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(subscriber); compositeSubscription.add(subscription); } @Override protected void onDestroy() { super.onDestroy(); this.subscription.unsubscribe(); }

Tengo que mencionar que mis observables solo emitirán una vez, la actividad no debe esperar más llamadas del Observable.

¿Cuál es mejor?

Gracias por adelantado


Creo que eso depende de tus necesidades. Si la actividad no espera otras llamadas, supongo que podría darse de baja en onCompleted ().

Siempre doy de baja en onDestroy ()

@Override protected void onDestroy() { super.onDestroy(); if (subscription != null) { subscription.unsubscribe(); } }

EDITAR: eche un vistazo a http://reactivex.io/RxJava/javadoc/rx/subscriptions/CompositeSubscription.html

private CompositeSubscription mCompositeSubscription = new CompositeSubscription(); private void doSomething() { mCompositeSubscription.add( AndroidObservable.bindActivity(this, Observable.just("Hello, World!")) .subscribe(s -> System.out.println(s))); } @Override protected void onDestroy() { super.onDestroy(); mCompositeSubscription.unsubscribe(); }


De las dos opciones, la segunda es mejor.

En su primer ejemplo, está onComplete() la unsubscribing en el método onComplete() que no es necesario. Si llega al onComplete() de una Suscripción, ya no tiene la responsabilidad de onComplete() su suscripción.

Tu segundo ejemplo es el correcto. La idea detrás de CompositeSubscription es que puede agregarle múltiples Subscriptions y luego limpiarlas ( unsubscribe ) a la vez. En otras palabras, esto le ahorra la necesidad de mantener una lista de las Subscriptions que necesita darse de baja.

Una parte complicada de usar CompositeSubscription es que si una vez se da de unsubscribe , NO puede volver a usarla. Puede consultar la documentación del método compositeSubscription.add() para obtener más información sobre por qué. En resumen, cancelará directamente la suscripción que está intentando agregar. Esa ha sido una decisión deliberada (puedes leer más sobre esto HERE ).

Volviendo a su ejemplo, llamar a unsubscribe() en onDestroy() de la Actividad está bien y lo salvará de las pérdidas de memoria. Con respecto a su comentario de que ocurren problemas cuando llama al método test() varias veces, diría que su problema está en otra parte. Tal vez su caso de uso no debería permitirlo llamar varias veces, tal vez debería limpiar los datos antiguos antes de usar el que acaba de recibir, etc. Tal vez si ha explicado en detalle a qué tipo de problemas se enfrenta, podríamos ayudarlo más. Pero en lo que respecta a CompositeSubscription : ¡lo está utilizando y cancelando su suscripción correctamente!


No es necesario darse de baja en onCompleted . Echa un vistazo a El contrato observable

Cuando un Observable emite una notificación OnError o OnComplete a sus observadores, esto finaliza la suscripción. Los observadores no necesitan emitir una notificación de cancelación de suscripción para finalizar las suscripciones que finaliza el observable de esta manera.

Por otro lado, definitivamente debe cancelar la suscripción en onDestroy para evitar pérdidas de memoria.