android retrofit rx-java android-lifecycle

android - RxJava volver a suscribirse al evento después de la restauración de la actividad



retrofit rx-java (2)

No necesariamente tienes que usar ningún patrón de arquitectura para lograr eso. Aunque cualquier MVP / MVC es bueno para la separación, las pruebas, etc., hacer que su Controlador / Presentador / DAO sea un singleton para toda la aplicación, que mantiene la memoria durante toda la vida de la aplicación no es precisamente una buena idea.

Aquí hay un proyecto de ejemplo que utiliza una instancia de fragmento retenido y RxJava - https://github.com/krpiotrek/RetainFragmentSample

La idea principal es usar Fragmento con setRetainInstance (true) llamado, que lo protege de ser destruido en el cambio de orientación, y almacenar su Observable allí. Así es como manejas eso en Activity / Fragment onCreate

protected void onCreate(Bundle savedInstanceState) { if (savedInstanceState == null) { // first run, create observable mInfoObservable = createInfoObservable(); // set Observable in retained fragment RetainFragmentHelper.setObject(this, getSupportFragmentManager(), mInfoObservable); } else { // following runs, get observable from retained fragment mInfoObservable = RetainFragmentHelper.getObjectOrNull(this, getSupportFragmentManager()); } // subscribe mInfoObservable.subscribe(...); }

Tenga en cuenta que su Observable tiene que almacenar el último valor en la caché, una forma es usar el operador cache () .

Todavía estoy pensando en RxJava y lo estoy usando para hacer cosas de redes con Retrofit 2. Lo he estado probando por un par de días y me gusta que el código parezca más legible ahora, pero me he encontrado con un problema que parece que no puedo encontrar. alrededor.

Estoy intentando realizar un inicio de sesión (que devuelve un token de API) y luego usar este token para obtener algunos datos iniciales en la misma cadena, de modo que la salida de la cadena sea el token + datos. Para ello llamo a mi servicio API con un

apiClient .login() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .flatMap(token -> getData(token)) .subscribe(new Subscrber<Bundle>() {...});

Esto parecía estar bien, pero también quería mostrar una barra de progreso al iniciar y detener la cadena. Así que también agregué un .doOnSubscribe() y un .doOnUnsubscribe() a esto también. Sin embargo, noté que después de cambiar la orientación, el fragmento que estaba intentando ocultar la barra de progreso siempre es nulo.

Así que busqué y encontré la RxLifecycle que parecía que ayudaría y ahora .cache() y me .cache() baja de la cadena de eventos. ¿Pero no puedo averiguar cómo suscribirme al mismo evento nuevamente en onCreate() después de esto? Creo que me estoy perdiendo algo bastante básico y agradecería cualquier ayuda con esto.


.cache() asegurarse de que se suscribe a la misma instancia observable que se devuelve desde .cache() . Normalmente, almacenaría esta instancia en algún lugar de un Singleton (como la clase de aplicación), un fragmento retenido o un servicio de Android.