Estructura básica
Primero veamos el código más básico y analicemos cómo se implementa este código en RXJAVA.
Observable.onscribe <String> onSubscribe1 = new Observable.onsubscribe <String> () {@Override public void Call (suscriptor <? Super String> suscriptor) {suscriber.onnext ("1"); suscriptor.onCompleted (); }}; Suscriptor <String> suscriber1 = nuevo suscriptor <string> () {@Override public void onCompleted () {} @Override public void onError (showable e) {} @Override public void onNext (String s) {}}; observable.create (onScriber1) .subscribe (suscripter1);Primero, echemos un vistazo al código de observable.
Public Final Static <T> Observable <T> create (onSubscribe <T> f) {return nuevo observable <t> (Hook.onCreate (f));} protegido observable (onSubscribe <T> f) {this.onscribe = f;};};}; Llama directamente al constructor de observable para crear un nuevo objeto observable. Marcamos temporalmente este objeto como observable1 para la trazabilidad posterior.
Al mismo tiempo, el objeto de suscripción en el que pasamos se guardará en la propiedad de suscripción de observable1. Esta propiedad es muy importante en el contexto posterior, por favor preste atención.
A continuación, echemos un vistazo al método de suscripción.
Public final suscripción de suscripción (suscriptor <? Super t> suscriptor) {return observable.subscribe (suscriptor, this);} private static <t> suscripción (suscriptor <? Super t> suscriptor, observable <T> observable) {... subscriber.onstart (); Hook.subscribeStart (observable, observable.subscribe) .call (suscriptor); return gook.subsCribereturn (suscriptor);} Como puede ver, después de suscribir, el método observable1.subscribe.call se llama directamente, que es el método de llamadas del objeto OnSubScribe1 en nuestro código. Los parámetros aprobados son el objeto suscriptor1 definido en nuestro código. Lo que se hace en el método de llamada es llamar a los métodos OnNext y Oncompletos del objeto de suscriptor entrante1.
Esto permite la comunicación entre el observador y el observador. ¿No es muy simple?
public void Call (suscriptor <? Super String> suscriptor) {suscriber.onNext ("1"); suscriptor.onCompleted ();}Resumen del escenario de uso de Rxjava
1. Verifique primero el escenario en caché
Obtenga datos, primero verifique si hay un caché en la memoria y luego verifique si hay alguna condición previa en el caché del archivo y, finalmente, la siguiente condición se cumplirá desde la red.
Final Observable <String> Memory = Observable.Create (nuevo Observable.onsubscribe <String> () {@Override public Void Call (subscriber <? Super String> suscriber) {if (MemoryCache! = Null) {subscriber.Next (MemoryCache);} else {subscriber.oncompleted ();}}}); Obscribe <string> disk = Observable.create (nuevo observable.onsubscribe <String> () {@Override public void call (suscriptor <? Super String> subscriber) {string cachepref = rxpreferences.getString ("cache"). Get (); if (! TextUtils.isempty (cachePref)) suscripter.onCompleted (); Observable <String> Network = Observable.just ("Network"); // Lo principal es confiar en el operador concat para implementar observable.concat (memoria, disk, network) .first (). Suscriqueon (schedulers.newthread ()). Suscripción (s-> {memoria de memoria = "memoria"; system.out.Println ("--------------------------------- s);});2. La interfaz debe esperar hasta que múltiples interfaces hayan recopilado datos simultáneamente antes de actualizar
// divide la salida de dos observables, y el orden no está garantizado. Envíe al suscriptor en el orden de eventos vacío privado testMerge () {observable <String> observable1 = demoutils.createObServable1 (). Suscríbeon (schedulers.newthread ()); Observable <String> Observable2 = DeMoutils.CreateBServable2 (). SUNSCRICTEON (Schedulers.Newthread ()); Observable.merge (observable1, observable2) .subscriteon (schedulers.newthread ()) .subscribe (system.out :: println);}3. La solicitud de una interfaz depende de los datos devueltos por otra solicitud de API.
Por ejemplo, después de que necesitamos iniciar sesión, a menudo obtenemos la lista de mensajes basada en el token que obtenemos.
Aquí, Rxjava se usa para resolver el problema de las devoluciones de llamada anidadas. Hay un sustantivo propio llamado infierno de devolución de llamada
NetworkService.getToken ("Nombre de usuario", "Password") .flatmap (S -> NetworkService.getMessage (S)) .Subscribe (S -> {System.out.println ("Mensaje:" + S);});4. El botón de interfaz debe evitar los clics continuos
Rxview.clicks (findViewByid (r.id.btn_throttle)) .throttlefirst (1, timeUnit.seconds) .subscribe (evitar -> {system.out.println ("hacer clic");});5. Interfaz receptiva
Por ejemplo, la casilla de verificación se verifica y la preferencia correspondiente se actualiza automáticamente.
SharedPreferences Preferences = PrefferenceManager.getDefaultSharedPreferences (this); rxSharedPreferences rxpreferences = rxsharedpreferences.create (preferencias); preferencia <Boolean> checked = rxPreferences.getBoolean ("checked", true); checkboxbox = (checkbox) findViewById (r.id.cb_test); rxCompoundButton.CheckedChanges (casilla de verificación) .subscribe (checked.asAction ());6. Transformación de datos compleja
Observable.just ("1", "2", "2", "3", "4", "5") .map (Integer :: ParseInt) .filter (S -> S> 1) .Distinct () .take (3) .REDUCE ((Integer, Integer2) -> integer.intvalue () + integer2.intvalue ())) .subscribe (System.out :: println); // 9