Structure de base
Examinons d'abord le code le plus basique et analysons la façon dont ce code est implémenté dans Rxjava.
Observable.onsubscribe <string> onSubscribe1 = new observable.onsubscribe <string> () {@Override public void Call (abonné <? Super String> abonné) {subsonné.onnext ("1"); abonné.oncompleted (); }}; Abonné <string> subscriber1 = new abonné <string> () {@Override public void onCompleted () {} @Override public void onError (Throwable E) {} @Override public void onNext (String S) {}}; observable.create (onSubScriber1) .Subscribe (subrusber1);Tout d'abord, jetons un coup d'œil au code d'observable.
public final static <T> observable <T> créer (onSubscribe <T> f) {return new observable <t> (hook.oncreate (f));} Protected observable (onSubscribe <T> f) {this.onsubscribe = f;} Il appelle directement le constructeur d'observables pour créer un nouvel objet observable. Nous marquons temporairement cet objet comme observable1 pour une traçabilité ultérieure.
Dans le même temps, l'objet ONSubscribe dans lequel nous sommes passés sera enregistré dans la propriété ONSubscribe d'Observable1. Cette propriété est très importante dans le contexte ultérieur, veuillez faire attention.
Ensuite, jetons un coup d'œil à la méthode d'abonnement.
Abonnement final public abonnement (abonné <? Super T> abonné) {return observable.subscribe (abonné, this);} abonnement statique privé <T> abonnement (abonné <? Super T> abonné, observable <T> observable) {... subscriber.onstart (); hook.onsubscribeStart (observable, observable.onsubscribe) .Call (abonné); return hook.onsubscribiberturn (abonné);} Comme vous pouvez le voir, après vous être abonné, la méthode observable1.onsubscribe.Call est appelée directement, qui est la méthode d'appel de l'objet onSubscribe1 dans notre code. Les paramètres passés sont l'objet abonné à l'abonné défini dans notre code. Ce qui est fait dans la méthode d'appel, c'est d'appeler les méthodes onNext et onComplete de l'objet abonné entrant.
Cela permet une communication entre l'observateur et l'observateur. N'est-ce pas très simple?
Call public void (abonné <? Super String> abonné) {abonné.onnext ("1"); abonné.oncompleted ();}RXJAVA Utilisation Scénario Résumé
1. Vérifiez d'abord le scénario mis en cache
Obtenez des données, vérifiez d'abord s'il y a un cache dans la mémoire, puis vérifiez s'il y a une condition antérieure dans le cache de fichier, et enfin, la condition suivante sera satisfaite du réseau.
Final observable <string> mémoire = observable.Create (new observable.onsubscribe <string> () {@Override public void call (abonné <? Super String> abonné) {if (MemoryCache! = null) {subscriber.onnext (mémoire Observable.Create (new observable.onsubscribe <string> () {@Override public void Call (abonné <? Super String> abonné) {String cachepref = rxpreferences.getString ("cache"). Get (); if (! TextUtils.isempty (cachepref)) {subscrat abonné.oncompleted ();}}}); Observable <string> réseau = observable.Just ("réseau"); // l'essentiel est de s'appuyer sur l'opérateur Concat pour implémenter observable.concat (mémoire, disque, réseau).2. L'interface doit attendre que plusieurs interfaces aient collecté des données simultanément avant de mettre à jour
// Divit la sortie de deux observables et l'ordre n'est pas garanti. Envoyer à l'abonné dans l'ordre des événements private void testmerge () {observable <string> observable1 = demoutils.CreateObservable1 (). Abonceon (schedulers.newthread ()); Observable <string> observable2 = demoutils.CreateObservable2 (). Abonceon (schedulers.newthread ()); Observable.merge (observable1, observable2) .subscribeon (scheners.newthread ()) .subscribe (System.out :: println);}3. La demande d'une interface dépend des données renvoyées par une autre demande d'API.
Par exemple, après que nous devons nous connecter, nous obtenons souvent la liste de messages basée sur le jeton que nous obtenons.
Ici, Rxjava est utilisé pour résoudre le problème des rappels imbriqués. Il y a un nom approprié appelé Hellback
NetworkService.getToken ("nom d'utilisateur", "mot de passe") .flatMap (s -> NetworkService.getMessage (S)) .Subscribe (s -> {System.out.println ("Message:" + S);});4. Le bouton d'interface doit empêcher les clics continus
Rxview.clicks (findViewByid (r.id.btn_throttle)) .throttleFirst (1, timeunit.seconds) .subscribe (éviter -> {System.out.println ("cliquez");});5. Interface réactive
Par exemple, CheckBox est coché et la préférence correspondante est automatiquement mise à jour.
SharedPreferences Preferrences = préférenceManager.getDefaultSharedPreferences (this); rxsharedpreferences rxpreferences = rxsharedpreferences.create (préférences); préférence <boolean> checked = rxpreference.getBoolean ("Checked", true); checkbox checkbox = (checkbox) findViewByid (r.id.cb_test); rxCompoundButton.CheckEdChanges (Checkbox) .Subscribe (Checked.Asaction ());6. Transformation de données complexe
Observable.Just ("1", "2", "2", "3", "4", "5") .map (Integer :: paSeInt) .filter (S -> S> 1) .Distinct () .Take (3) .reduce ((Integer, Integer2) -> Integer.intvalue () + Intger2.IntValue ()) .Subscribe (System.out :: println); // 9