سواء كانت صفحة تسجيل دخول بسيطة أو صفحة إرسال ترتيب معقدة ، فإن التحقق الأمامي من النموذج (مثل اسم تسجيل الدخول وكلمة المرور تلبية المتطلبات الأساسية قبل أن يتم إلقاء الضوء على زر تسجيل الدخول) هو خطوة لا غنى عنها. توضح هذه المقالة كيفية استخدام Rxjava للتعامل بسهولة مع مشكلات التحقق قبل تقديم النموذج. يستخدم المثال صفحة تسجيل دخول بسيطة على Android.
ملخص المحتوى
طرق التحقق التقليدية
Combinelatest عامل
استخدم Combinelatest لمعالجة التحقق من النموذج
الفرق بين Combinelatest و Zip
يوجد رمز العينة الموضح في هذه المقالة في Rxandroiddemo ، راجع ملف تسجيل الدخول
طرق التحقق التقليدية
نستخدم هنا أبسط مثال لتوضيح ، كما هو موضح في الشكل أعلاه ، إدخال بريد إلكتروني وإدخال كلمة المرور ، وأدلي هو زر تسجيل الدخول. لن يتم إضاءة الزر أدناه إلا إذا كان محتوى مربع إدخال البريد الإلكتروني يحتوي على @ أحرف ويكون محتوى مربع إدخال كلمة المرور أكبر من 4.
بادئ ذي بدء ، إذا كنت تستخدم EditText أو Nertit من EditText ، بشكل عام ، يمكنك استخدام AddTextChangedListener للاستماع إلى محتواه. ومع ذلك ، فمن الواضح أنه يجب تحديد تمكين أو عدم وجود زر تسجيل الدخول في نفس الوقت عن طريق البريد الإلكتروني وكلمة المرور. كلاهما لا يمكن إضاءة إلا. لذلك ، في TextWatcher للبريد الإلكتروني ، يجب ألا نحكم فقط على ما إذا كان البريد الإلكتروني يفي بالشروط ، ولكن أيضًا تحديد ما إذا كانت كلمة المرور تلبي الشروط في نفس الوقت ، مما سيؤدي بسهولة إلى أحكام متعددة.
تخيل لو كنت تقوم بتقديم نموذج طلب ، مع أكثر من عشرة مربعات إدخال عليه ، ويفي كل محتوى إدخال بالشروط في نفس الوقت ، يمكنك إضاءة زر "إرسال". كم هو مؤلم - يجب استخدام كل تغيير في مربع الإدخال لتحديد ما إذا كان محتوى العشرات الأخرى يلتقي بنفسه (في الواقع ، لم تتغير عشرات الإدخال العشرات في هذا الوقت)
Combinelatest عامل
Combinelatest هو عامل مشترك مشترك توفره Rxjava نفسه ، والذي يقبل اثنين أو أكثر من الملاحظات وإغلاق Funcx. عندما يقوم أي من الملاحظات الواردة بنقل البيانات ، يتم دمج قيمة CombineLatest (الأخيرة) لكل من كل ما يمكن ملاحظته لتمريرها إلى إغلاق Funcx للمعالجة. النقطة هي
1.Combinelatest سوف تخزن أحدث قيمة لكل شيء يمكن ملاحظته
2. أي انبعاثات يمكن ملاحظتها قيمة جديدة وتؤدي إلى تشغيل العملية -> "الجمع بين جميع القيمة الأخيرة التي يمكن ملاحظتها معًا وإرسالها إلى الوظيفة"
استخدم Combinelatest لمعالجة التحقق من النموذج
أولاً ، نكتب طريقة التحقق من البريد الإلكتروني وكلمة المرور. يحتاج المرء إلى احتواء @ أحرف ، والآخر يتطلب أكثر من 4 أحرف:
isemailvalid boolean الخاص (سلسلة البريد الإلكتروني) {// toDo: استبدل هذا بـ logic repress elem.contains ("@") ؛ )بعد ذلك ، نقوم بإنشاء ملاحظات للبريد الإلكتروني وكلمة المرور على التوالي ، والقيمة المنبعثة هي محتوى التغييرات في كل edittext. قيمة الإرجاع لطريقة رد الاتصال على المكالمات هي المعلمة الواردة للطريقة التي يتم إجراؤها في TextWatcher:
يمكن ملاحظته <string> robortable = rocartable.create (new abountable.onsubscribe <string> () {Override Public Void Call (المشترك النهائي <؟ super string> مشترك) {memailview.addtextChangedListener (new textWatcher () void ontextChanged (charquence s ، int ، int ، int count) {} override public void aftertextChanged (redable s) {cumpriber.onnext ( يمكن ملاحظته <String> complablepassword = obsertable.create (new obsertable.onsubscribe <string> () {Override Public Void Call (المشترك النهائي <؟ super string> مشترك) {mpasswordview.addtextChangedListener (new textWatcher () void ontextChanged (charquence s ، int ، int ، int count) {} override public void aftertextChanged (redable s) {cumpriber.onnext (أخيرًا ، استخدم combinelastest للجمع بين الملاحظة و ObountablePassword للتحقق:
opprocessable.combinelatest (ObscerableEmail ، compleablepassword ، func2 new <string ، string ، boolean> () {Override public boolean call (string email ، password) {return isemailvalid (elemt) Override public void onerror (throwable e) {} override public void onnext (Boolean تحقق) {if (تحقق في onnext هو نتيجة الجمع بين الاثنين بعد الجمع بين أكثر.
انظر طريقة bindView () لوجود تسجيل الدخول
هنا ، حتى لو كان النموذج معقدًا للغاية ، فمن السهل في الواقع التوسع إذا كنت بحاجة إلى:
1. تغليف الملاحظة لكل edittext
2. أعد كتابة هذه الجملة وأضف منطقًا جديدًا:
إرجاع isemailvalid (البريد الإلكتروني) && iSpasswordValid (كلمة المرور) ؛
هل تعتقد أن الأمر يتطلب الكثير من التعليمات البرمجية المكررة لتغليف مراقبة لكل edittext؟ لا تقلق ، لقد اعتقد جيك وارتون منذ فترة طويلة أن RxtextView في Rxbinding يمكن أن يحل هذه المشكلة:
يمكن ملاحظته <HARQUENCENT> ORBRONGEMAIL = rxtextView.textChanges (memailview) ؛ يمكن ملاحظته <HARSEPRENCENCE> قابلاً للملاحظة = rxtextView.textChanges (mpasswordview) ؛ roballable.combinelatest (obscablemail ، funcword ، charquence ، charquence ، كلمة مرور charsequence) {return isemailvalid (email.toString ()) تحقق) {if (انظر طريقة bindViewByRxBinding () من تسجيل الدخول
الفرق بين Combinelatest و Zip
ZIP هو عامل مشغل يشبه إلى حد ما combinelatest ، والمعلمات التي يقبلها هي اثنين أو أكثر من الملاحظات وإغلاق. لكن الفرق هو:
1.SIP هو الجمع بين كل ما يمكن ملاحظته بالترتيب ، مثل البيانات الأولى من الملاحظة والبيانات الأولى لـ ObscensableB وإرسالها إلى FUNCX للمعالجة ، يتم دمج البيانات التاسعة للاثنين ونقلها إلى FUNCX للمعالجة ، وما إلى ذلك.
2.zip لا تؤدي إلى معالجة الإغلاق عندما تنقل أي بيانات يمكن ملاحظتها ، ولكنها تنتظر أن يتم نقل البيانات التاسعة التي يمكن ملاحظتها بالكامل قبل التشغيل.
يتم استخدام ZIP بشكل عام لدمج البيانات المرتبة بالترتيب من قبل أطراف متعددة.
ما سبق هو تحليل موجز لطريقة Rxjava للتعامل مع مشاكل التحقق المعقدة من النماذج التي أدخلها المحرر. آمل أن يكون ذلك مفيدًا للجميع. إذا كان لديك أي أسئلة ، فيرجى ترك رسالة لي وسوف يرد المحرر على الجميع في الوقت المناسب. شكرا جزيلا لدعمكم لموقع wulin.com!