Apakah itu halaman login sederhana atau halaman pengiriman pesanan yang kompleks, verifikasi front-end formulir (seperti nama login dan kata sandi memenuhi persyaratan dasar sebelum tombol login dapat diterangi) adalah langkah yang sangat diperlukan. Artikel ini menunjukkan cara menggunakan RXJAVA untuk dengan mudah menangani masalah verifikasi sebelum pengiriman formulir. Contoh ini menggunakan halaman login sederhana di Android.
Ringkasan Konten
Metode verifikasi tradisional
Operator Combinelatest
Gunakan combinelatest untuk memproses verifikasi formulir
Perbedaan antara combinelatest dan zip
Kode sampel yang ditunjukkan dalam artikel ini terletak di RXANDroidDemo, lihat File LoginActivity
Metode verifikasi tradisional
Di sini kami menggunakan contoh paling sederhana untuk menggambarkan, seperti yang ditunjukkan pada gambar di atas, input email dan input kata sandi, dan di bawah ini adalah tombol login. Tombol di bawah ini hanya akan diterangi jika konten kotak input email berisi @ karakter dan konten kotak input kata sandi lebih besar dari 4.
Pertama -tama, jika Anda menggunakan EditText atau warisan dari EditText, secara umum, Anda menggunakan AddTextChangedListener untuk mendengarkan kontennya. Namun, jelas bahwa mengaktifkan atau tidak dari tombol login harus ditentukan secara bersamaan melalui email dan kata sandi. Keduanya hanya bisa menyala. Oleh karena itu, dalam pengamat teks email, kita tidak hanya harus menilai apakah email memenuhi syarat, tetapi juga menentukan apakah kata sandi memenuhi persyaratan pada saat yang sama, yang akan dengan mudah mengarah pada beberapa penilaian.
Bayangkan jika Anda mengirimkan formulir pemesanan, dengan lebih dari selusin kotak input di atasnya, dan setiap konten input memenuhi kondisi pada saat yang sama, Anda dapat menyalakan tombol "Kirim". Betapa menyakitkan - setiap perubahan dalam kotak input harus digunakan untuk menentukan apakah konten dari selusin kotak input lainnya memenuhi yang sama (pada kenyataannya, selusin kotak input lainnya tidak berubah saat ini)
Operator Combinelatest
Combinelatest adalah operator umum yang disediakan oleh RXJAVA itu sendiri, yang menerima dua atau lebih yang dapat diamati dan penutupan funcx. Ketika salah satu dari yang masuk yang dapat diamati mentransmisikan data, nilai combinelatest (lastest) dari masing -masing yang dapat diamati digabungkan untuk meneruskannya ke penutupan funcx untuk diproses. Intinya adalah
1.combinelatest akan menyimpan nilai terbaru dari setiap yang dapat diamati
2. Setiap yang dapat diamati memancarkan nilai baru dan memicu operasi -> "Gabungkan semua nilai terakhir yang dapat diamati bersama -sama dan kirim ke fungsi"
Gunakan combinelatest untuk memproses verifikasi formulir
Pertama, kami menulis metode verifikasi email dan kata sandi. Satu perlu mengandung @ karakter, dan yang lainnya membutuhkan lebih dari 4 karakter:
private boolean isemailvalid (email string) {// todo: ganti ini dengan logika Anda sendiri return email.contains ("@"); } private boolean ispasswordvalid (kata sandi string) {// todo: ganti ini dengan logika Anda sendiri return password.length ()> 4;}Kemudian, kami membuat yang dapat diamati untuk email dan kata sandi masing -masing, dan nilai yang dipancarkan adalah konten dari perubahan di setiap editteks. Nilai pengembalian metode panggilan balik panggilan adalah parameter masuk dari metode aftertextchanged di TextWatcher:
Observable <String> ObservableMail = Observable.create (new Observable.onsubscribe <string> () {@Override public void call (Pelanggan akhir <? Super String> Pelanggan) {Memailview.AddTextChangedListener (TextWatcher baru, Int Int IntoCtEnride Void Public BeforextChanged (TextWatcher () {OUTRERRIDE PUBLIC VOID BeFORETEXTCHANGEDER (TextWatcher () {OUTOLRIDE PUBLIC VOID beforextChanged void ontextChanged (charsequence s, int start, int sebelumnya, int count) {} @Override void aftertextChanged (edited s) {subscriber.onnext (s.toString ()); Observable <String> ObservablePassWord = Observable.create (new Observable.onsubscribe <pring> () {@Override public void call (Pelanggan akhir <? Super String> Pelanggan) {mpassword.addtextChangeDistener (TextWatcher () {@Override public void beforextchang @Override void ontextChanged (CharSePle S, int start, int sebelumnya, int count) {} @Override void aftertextChanged (edited s) {subscriber.onnext (s.toString ());Akhirnya, gunakan CombineLastest untuk menggabungkan ObservableMail dan ObservablePassword untuk memverifikasi:
Observable.comBinelatest (ObservableMail, ObservablePassword, Func2 baru <String, String, Boolean> () {@Override Public Boolean Call (Email String, Kata Sandi String) {return isemailValid (email) && oLOLEAND (kata sandi);}}). Subscribe (Subscriber <boolean> {oMoid); oid {oMoid);} {oMOOD). @Override public void onError (Throwable e) {} @Override public void onNext (boolean verify) {if (verify) {memailsigninbutton.setenabled (true)}};Verifikasi di Onnext adalah hasil dari menggabungkan keduanya setelah gabungan yang paling baik.
Lihat metode LoginActivity's BindView ()
Di sini, bahkan jika formulirnya sangat kompleks, sebenarnya mudah untuk diperluas jika Anda perlu:
1. Merangkum yang dapat diamati untuk setiap editteks
2. Tulis ulang kalimat ini dan tambahkan logika baru:
return iseMailValid (email) && isPasswordValid (kata sandi);
Apakah Anda pikir dibutuhkan banyak kode duplikat untuk merangkum yang dapat diamati untuk setiap editText? Jangan khawatir, Jake Wharton telah lama berpikir bahwa rxtextView di rxBinding dapat menyelesaikan masalah ini:
Observable <Charsequence> ObservableMail = rxtextView.TextChanges (MemailView); Observable <Charsequence> ObservablePassword = rxtextView.TextChanges (mpasswordview); call publicon (ucmablean> @ @ @ @ @ @ @ @ @ @ @func2 <charsean @func2 <Charseelate, charseure. Kata Sandi CharSequence) {return iseMailValid (email.toString ()) && isPasswordValid (kata sandi.toString ())); verifikasi) {if (verifikasi) {memailSigninButton.setEnabled (true);Lihat metode LoginActivity BindViewByRxBinding ()
Perbedaan antara combinelatest dan zip
ZIP adalah operator yang agak mirip dengan combinelatest, dan parameter yang diterimanya adalah dua atau lebih yang dapat diamati dan penutupan. Tapi bedanya adalah:
1.zip adalah untuk menggabungkan setiap yang dapat diamati secara ketat secara ketat, seperti data pertama Observablea dan data pertama yang dapat diamatib dikombinasikan dan ditransmisikan ke funcx untuk diproses, data ke -n keduanya digabungkan dan ditransmisikan ke funcx untuk diproses, dan sebagainya.
2.ZIP tidak memicu pemrosesan penutupan ketika ada data yang dapat diamati, tetapi menunggu data ke -n yang dapat diamati sepenuhnya ditransmisikan sebelum dipicu.
ZIP umumnya digunakan untuk mengintegrasikan data yang diatur secara berurutan oleh banyak pihak.
Di atas adalah analisis singkat dari metode RXJAVA untuk menangani masalah verifikasi bentuk yang kompleks yang diperkenalkan oleh editor. Saya harap ini akan membantu semua orang. Jika Anda memiliki pertanyaan, silakan tinggalkan saya pesan dan editor akan membalas semua orang tepat waktu. Terima kasih banyak atas dukungan Anda ke situs web Wulin.com!