Qu'il s'agisse d'une page de connexion simple ou d'une page de soumission de commande complexe, la vérification frontale du formulaire (telles que le nom de connexion et le mot de passe répondent aux exigences de base avant que le bouton de connexion puisse être éclairé) est une étape indispensable. Cet article montre comment utiliser Rxjava pour gérer facilement les problèmes de vérification avant la soumission du formulaire. L'exemple utilise une page de connexion simple sur Android.
Résumé du contenu
Méthodes de vérification traditionnelles
opérateur combinée
Utilisez Combinelatest pour traiter la vérification du formulaire
La différence entre combinélatest et zip
L'exemple de code indiqué dans cet article est situé dans RxandroidDemo, voir le fichier de connectivité
Méthodes de vérification traditionnelles
Ici, nous utilisons l'exemple le plus simple pour illustrer, comme le montre la figure ci-dessus, une entrée par e-mail et une entrée de mot de passe, et ci-dessous est un bouton de connexion. Le bouton ci-dessous ne sera illuminé que si le contenu de la zone d'entrée de messagerie contient @ les caractères et que le contenu de la boîte d'entrée de mot de passe est supérieur à 4.
Tout d'abord, si vous utilisez EditText ou hériter de EditText, d'une manière générale, vous utilisez AddTextChangedListener pour écouter son contenu. Cependant, il est évident que l'activation ou non du bouton de connexion doit être déterminée en même temps par e-mail et mot de passe. Les deux ne peuvent être allumés que. Par conséquent, dans le Textwatcher de l'e-mail, nous devons non seulement juger si l'e-mail remplit les conditions, mais également déterminer si le mot de passe remplit les conditions en même temps, ce qui entraînera facilement des jugements multiples.
Imaginez si vous soumettez un bon de commande, avec plus d'une douzaine de boîtes d'entrée dessus, et chaque contenu d'entrée répond aux conditions en même temps, vous pouvez allumer le bouton "Soumettre". Comme c'est douloureux - chaque changement dans la boîte d'entrée doit être utilisé pour déterminer si le contenu des autres douzaines de boîtes d'entrée se réunit (en fait, les autres douzaines de boîtes d'entrée n'ont pas changé pour le moment)
opérateur combinée
Combinelatest est un opérateur commun fourni par Rxjava lui-même, qui accepte deux observables ou plus et une fermeture Funcx. Lorsque l'un des observables entrants transmet des données, la valeur la plus combinéne (la plus longue) de chaque observable est combinée pour la transmettre à la fermeture Funcx pour le traitement. Le point est
1.COMBINELATEST stockera la valeur la plus récente de chaque observable
2. Tout observable émet une nouvelle valeur et déclenche l'opération -> "Combinez ensemble toute la dernière valeur de l'observable et envoyez à la fonction"
Utilisez Combinelatest pour traiter la vérification du formulaire
Tout d'abord, nous écrivons la méthode de vérification de l'e-mail et du mot de passe. L'un doit contenir des caractères, et l'autre nécessite plus de 4 caractères:
Boolean privé iSemailValid (courrier électronique de chaîne) {// todo: remplacez-le par votre propre logique return email.contains ("@"); } private booléen iSpasswordValid (mot de passe de chaîne) {// todo: remplacez-le par votre propre mot de passe de retour logique.length ()> 4;}Ensuite, nous créons respectivement des observables pour les e-mails et le mot de passe, et la valeur émise est le contenu des modifications dans chaque édition. La valeur de retour de la méthode de rappel d'appel est le paramètre entrant de la méthode AfterTextChanged dans TextWatcher:
Observable <string> observableemail = observable.create (new observable.onsubscribe <string> () {@Override public void Call (abonné final <? Super String> onTextChanged (CharSequence s, int start, int, int count) {} @Override public void afterTextChanged (editable s) {subscriber.onnext (s.toString ());}}); Observable <string> observablepassword = observable.create (new observable.onsubscribe <string> () {@Override public void call (final abonné <? Super String> abonné) {@Override public.AdDtextChangedListener (new TextWatcher () {@Override public Void BeforExtChanged (CharReLECT public void ontextChanged (chardence s, int start, int, int count) {} @Override public void afterTextChanged (editable s) {subscriber.onnext (s.toString ());});Enfin, utilisez CombineLastest pour combiner observableemail et observablepassword pour vérifier:
Observable.Combinelatest (observableMail, observablepassword, new func2 <String, String, boolean> () {@Override public booléen appel (courriel de chaîne, mot de passe de chaîne) {return isEmailValid (e-mail) && ispasswordvalid (mot de passe);}}). @Override public void onError (Throwable E) {} @Override public void onNext (boolean Verify) {if (vérifiez) {memailSignInbutton.setEnabled (true);} else {memailSignInButton.Vérifier dans onNext est le résultat de la combinaison des deux après avoir combiné le plus.
Voir la méthode BindView () de LoginActivity
Ici, même si le formulaire est très complexe, il est en fait facile de développer si vous avez besoin:
1. Encapsuler un observable pour chaque édition
2. Réécrivez cette phrase et ajoutez une nouvelle logique:
return iseMailValid (e-mail) && isPasswordValid (mot de passe);
Pensez-vous qu'il faut beaucoup de code en double pour encapsuler un observable pour chaque édition? Ne vous inquiétez pas, Jake Wharton a longtemps pensé que le RxtextView dans RXBinding peut résoudre ce problème:
Observable <CharSequence> observableEmail = rxtextView.TextChanges (memailView); observable <harSequence> observablePassword = rxtextView.TextChanges (mpasswordView); observable.comBinelatest (observableEmail, observablepassword, nouveau Func2 <CharSequence, Chardesence, booolean>) {@Override Public Boolean Call (Chardesence Contrac ot (vérifiez) {memailSignInButton.setEnabled (true);} else {memailSignInButton.setEnabled (false);}});Voir la méthode BindViewByrXBinding () de LoginActivity
La différence entre combinélatest et zip
Zip est un opérateur quelque peu similaire à Combinelatest, et les paramètres qu'il accepte sont deux observables ou plus et une fermeture. Mais la différence est:
1.zip consiste à combiner chaque observable strictement dans l'ordre, comme les premières données d'Observablea et les premières données de l'observableB sont combinées et transmises à Funcx pour le traitement, les données nième des deux sont combinées et transmises à Funcx pour le traitement, etc.
2.ZIP ne déclenche pas le traitement de fermeture lorsqu'une transmet des données observables, mais attend que les données de chaque observable soient entièrement transmises avant le déclenchement.
Le ZIP est généralement utilisé pour intégrer les données organisées dans l'ordre par plusieurs parties.
Ce qui précède est une brève analyse de la méthode de Rxjava pour faire face aux problèmes de vérification de forme complexes introduits par l'éditeur. J'espère que ce sera utile à tout le monde. Si vous avez des questions, veuillez me laisser un message et l'éditeur répondra à tout le monde à temps. Merci beaucoup pour votre soutien au site Web Wulin.com!