Ya sea que se trate de una página de inicio de sesión simple o una página compleja de envío de pedidos, la verificación frontal del formulario (como el nombre de inicio de sesión y la contraseña, cumplen con los requisitos básicos antes de que el botón de inicio de sesión pueda iluminar) es un paso indispensable. Este artículo muestra cómo usar RXJAVA para manejar fácilmente los problemas de verificación antes del envío del formulario. El ejemplo usa una página de inicio de sesión simple en Android.
Resumen de contenido
Métodos de verificación tradicionales
operador combinelatente
Use combinelateStest para procesar la verificación de formulario
La diferencia entre combinelatest y zip
El código de muestra que se muestra en este artículo se encuentra en RxandroidDemo, consulte el archivo de LoginActivity
Métodos de verificación tradicionales
Aquí usamos el ejemplo más simple para ilustrar, como se muestra en la figura anterior, una entrada de correo electrónico y una entrada de contraseña, y a continuación hay un botón de inicio de sesión. El botón a continuación se iluminará solo si el contenido del cuadro de entrada de correo electrónico contiene @ caracteres y el contenido del cuadro de entrada de contraseña es mayor que 4.
En primer lugar, si usa EditText o hereda de EditText, en general, usa AddTextChangedListener para escuchar su contenido. Sin embargo, es obvio que la habilitación o no del botón de inicio de sesión debe determinarse al mismo tiempo por correo electrónico y contraseña. Ambos solo pueden estar encendidos. Por lo tanto, en el cuadro de texto del correo electrónico, no solo debemos juzgar si el correo electrónico cumple con las condiciones, sino que también determinar si la contraseña cumple con las condiciones al mismo tiempo, lo que conducirá fácilmente a múltiples juicios.
Imagínese si está enviando un formulario de pedido, con más de una docena de cuadros de entrada, y cada contenido de entrada cumple con las condiciones al mismo tiempo, puede encender el botón "enviar". Qué doloroso es: cada cambio en el cuadro de entrada debe usarse para determinar si el contenido de las otras docenas de cuadros de entrada cumple con lo mismo (de hecho, las otras docenas de cuadros de entrada no han cambiado en este momento)
operador combinelatente
CombinElateSt es un operador común proporcionado por el propio Rxjava, que acepta dos o más observables y un cierre de Funcx. Cuando cualquiera de los observables entrantes transmite datos, el valor más combinable (último) de cada observable se combina para pasarlo al cierre de FUNCX para su procesamiento. El punto es
1.Combinelatest almacenará el valor más reciente de cada observable
2. Cualquier observable emite un nuevo valor y desencadena la operación -> "Combine todo el último valor observable juntos y envíe a la función"
Use combinelateStest para procesar la verificación de formulario
Primero, escribimos el método de verificación de correo electrónico y contraseña. Uno necesita contener personajes @, y el otro requiere más de 4 caracteres:
privado boolean isEmailValid (correo electrónico de cadena) {// TODO: reemplace esto con su propia lógica devuelve correo electrónico.contains ("@"); } boolean privado ispasswordValid (string contraseña) {// toDo: reemplace esto con su propia lógica return contraseña.length ()> 4;}Luego, creamos observables para correo electrónico y contraseña respectivamente, y el valor emitido es el contenido de los cambios en cada edittext. El valor de retorno del método de devolución de llamada de llamadas es el parámetro entrante del método de Cambia de TartoxtEnt. En TextWatcher:
Observable <String> ObservableEmail = Observable.Create (nuevo Observable.onsubscribe <String> () {@Override public void call (suscriptor final <? Super String> suscriber) {memailview.addtextChangedListener (nuevo textwatcher () {@Override public @Override public void OnTextChanged (CharSequence S, int Start, int antes, int count) {} @Override public void tardTextChanged (editable s) {suscripe.onnext (s.toString ()); Observable <String> ObservablePassword = Observable.create (nuevo Observable.onsubscribe <String> () {@Override public void Call (suscribe final <? Super String> Suscriber) {mpasswordView.addtextChangedListener (New TextWatcher () {@Override public @Override public void OnTextChanged (CharSequence S, int Start, int antes, int count) {} @Override public void tardTextChanged (editable s) {suscripe.onnext (s.toString ());Finalmente, use combinelastest para combinar observableEmail y observablePassword para verificar:
Observable.ComBinelAtest (ObservableEmail, ObservablePassword, New Func2 <String, String, Boolean> () {@Override public Boolean Call (String Correo electrónico, String Password) {return isEmailValid (correo electrónico) && ispasswordwordValid (contraseña);}}). Suscribir (nuevo suscriptiber <booleanean> () { @ @@Override void) @Override public void onError (lanzable e) {} @Override public void onNext (boolean verify) {if (verify) {memailSignInButton.setEnabled (true);Verificar en OnNext es el resultado de la combinación de los dos después de la combinación delest.
Consulte el método bindView () de LoginActivity
Aquí, incluso si el formulario es muy complejo, en realidad es fácil de expandir si es necesario:
1. Encapsular un observable para cada edittext
2. Reescribe esta oración y agregue una nueva lógica:
devolver isEmailValid (correo electrónico) && ispasswordValid (contraseña);
¿Crees que se necesita mucho código duplicado para encapsular un observable para cada edittext? No se preocupe, Jake Wharton ha pensado durante mucho tiempo que el rxtextview en rxbinding puede resolver este problema:
Observable <HarSequence> ObservableMail = rxtextView.TextChanges (memailView); observable <HarSequence> ObservablePassword = rxTextView.TextChanges (mpasswordView); observable.comBinElateSt (observableMail, observablePassword, nuevo FUNC2 <Charsequence, Charsequence, boinean> () { @ @ @ @ @ @ @ @ @ @@Override Calling, NEW FUNC2NED (CHARECHENECE, Calling, Caller, Caller, Calling, Caller, Call. Password CharSECHENCE) {return isEmailValid (correo electrónico.toString ()) && ispasswordValid (contraseña.Tostring ()); verificar) {if (verificar) {memailsigninButton.setEnabled (true);Consulte el método BindViewByRXBinding () de LoginActivity
La diferencia entre combinelatest y zip
ZIP es un operador que es algo similar a Combinelatest, y los parámetros que acepta son dos o más observables y un cierre. Pero la diferencia es:
1.ZIP es combinar cada observable estrictamente en orden, como los primeros datos de Observablea y los primeros datos de ObservableB se combinan y transmiten a Funcx para su procesamiento, los enésimo datos de los dos se combinan y transmiten a Funcx para su procesamiento, etc.
2.ZIP no desencadena el procesamiento de cierre cuando cualquier observable transmite datos, pero espera a que los enésimo datos de cada observable se transmitan por completo antes de activarse.
ZIP generalmente se usa para integrar los datos organizados en orden por múltiples partes.
Lo anterior es un breve análisis del método de RxJava para tratar los problemas complejos de verificación de formulario introducidos por el editor. Espero que sea útil para todos. Si tiene alguna pregunta, déjame un mensaje y el editor responderá a todos a tiempo. ¡Muchas gracias por su apoyo al sitio web de Wulin.com!