1. Gambaran keseluruhan
Dalam tutorial ini, kita akan bermain dengan jenis RxJava's Completable , yang mewakili hasil pengiraan tanpa nilai sebenarnya.
2. Ketergantungan RxJava
Mari sertakan kebergantungan RxJava 2 ke dalam projek Maven kami:
io.reactivex.rxjava2 rxjava 2.2.2
Kita biasanya dapat mencari versi terbaru di Maven Central.
3. Jenis yang Dapat Dilengkapkan
Selesai serupa dengan Yang Dapat Diperhatikan dengan satu-satunya pengecualian bahawa yang pertama memancarkan isyarat siap atau ralat tetapi tidak ada item. The Completable kelas mengandungi beberapa kaedah mudah untuk membuat atau mendapatkan daripada sumber reaktif yang berbeza.
Kami dapat memunculkan contoh yang segera diselesaikan dengan menggunakan Completable.complete () .
Kemudian, kita dapat melihat keadaannya dengan menggunakan DisposableCompletableObserver :
Completable .complete() .subscribe(new DisposableCompletableObserver() { @Override public void onComplete() { System.out.println("Completed!"); } @Override public void onError(Throwable e) { e.printStackTrace(); } });
Selain itu, kita dapat membina contoh yang Dapat Dilengkapkan dari Callable, Action, dan Runnable :
Completable.fromRunnable(() -> {});
Juga, kita boleh mendapatkan Completable contoh dari jenis lain menggunakan sama ada Completable.from () atau memanggil ignoreElement () pada Mungkin, Single, flowable, dan sumber diperhatikan sendiri:
Flowable flowable = Flowable .just("request received", "user logged in"); Completable flowableCompletable = Completable .fromPublisher(flowable); Completable singleCompletable = Single.just(1) .ignoreElement();
4. Chaining Completables
Kita boleh menggunakan rantai Penyelesaian dalam banyak kes penggunaan dunia nyata apabila kita hanya peduli dengan kejayaan operasi:
- Semua tindakan seperti melakukan permintaan PUT untuk mengemas kini objek jauh diikuti dengan kemas kini pangkalan data tempatan setelah berjaya
- Pembalakan dan penjurnalan pasca-fakta
- Pengaturan beberapa tindakan, seperti menjalankan tugas analitik setelah tindakan penyerapan selesai
Kami akan memastikan contohnya mudah dan bersifat agnostik. Pertimbangkan kami mempunyai beberapa Completable contoh:
Completable first = Completable .fromSingle(Single.just(1)); Completable second = Completable .fromRunnable(() -> {}); Throwable throwable = new RuntimeException(); Completable error = Single.error(throwable) .ignoreElement();
Untuk menggabungkan dua Selesai menjadi satu, kita boleh menggunakan operator andThen () :
first .andThen(second) .test() .assertComplete();
Kami dapat merantai sebanyak mana Penyelesaian yang diperlukan. Pada masa yang sama, jika sekurang-kurangnya salah satu sumber gagal menyiapkan, menyebabkan Completable akan tidak bernyala onComplete () dan juga :
first .andThen(second) .andThen(error) .test() .assertError(throwable);
Tambahan pula, jika salah satu sumber adalah tidak terbatas atau tidak sampai onComplete atas sebab tertentu, yang terhasil Completable tidak akan api onComplete () tidak onError () juga.
Perkara yang baik yang kita masih boleh menguji senario ini:
... .andThen(Completable.never()) .test() .assertNotComplete();
5. Mengarang Siri Penyelesaian
Bayangkan kita mempunyai banyak Penyelesaian. Untuk kes penggunaan praktikal, anggaplah kita perlu mendaftarkan pengguna dalam beberapa subsistem yang berasingan.
Untuk menggabungkan semua Pelengkap menjadi satu, kita boleh menggunakan kaedah gabungan () keluarga. Pengendali penggabungan () membolehkan melanggan semua sumber.
Contoh yang dihasilkan selesai setelah semua sumber selesai . Selain itu, ia berakhir dengan onError apabila mana-mana sumber mengeluarkan ralat:
Completable.mergeArray(first, second) .test() .assertComplete(); Completable.mergeArray(first, second, error) .test() .assertError(throwable);
Mari beralih ke kes penggunaan yang sedikit berbeza. Katakan kita perlu melaksanakan tindakan untuk setiap elemen yang diperoleh dari Flowable.
Kemudian, kita mahu satu Completable untuk kedua-dua selesai hulu dan semua tindakan elemen-peringkat. Pengendali flatMapCompletable () membantu dalam kes ini:
Completable allElementsCompletable = Flowable .just("request received", "user logged in") .flatMapCompletable(message -> Completable .fromRunnable(() -> System.out.println(message)) ); allElementsCompletable .test() .assertComplete();
Begitu juga, kaedah di atas tersedia untuk kelas reaktif asas yang lain seperti Observable , Maybe , atau Single.
Sebagai konteks praktikal untuk flatMapCompletable () , kita boleh memikirkan untuk menghias setiap item dengan beberapa kesan sampingan. Kita boleh menulis entri log setiap elemen yang lengkap atau membuat tangkapan gambar pada setiap tindakan yang berjaya.
Akhir sekali, kami mungkin perlu untuk membina Completable daripada beberapa sumber-sumber lain dan mendapatkan ia ditamatkan sebaik sahaja salah seorang daripada mereka selesai. Di situlah pengendali amb boleh membantu.
The amb awalan ialah trengkas untuk "samar-samar", membayangkan ketidaktentuan tentang yang Completable tepat mendapat selesai. Contohnya, ambArray ():
Completable.ambArray(first, Completable.never(), second) .test() .assertComplete();
Nota, bahawa di atas Completable boleh juga menamatkan dengan onError () dan bukannya onComplete () bergantung kepada sumber menamatkan completable pertama:
Completable.ambArray(error, first, second) .test() .assertError(throwable);
Juga, setelah sumber pertama berakhir, sumber yang tersisa dijamin akan dibuang.
Ini bermakna semua Pelengkap yang sedang berjalan dihentikan melalui Disposable.dispose () dan CompletableObservers yang sesuai akan berhenti berlangganan.
Mengenai contoh praktikal, kita dapat menggunakan amb () ketika kita mengalirkan fail cadangan ke beberapa penyimpanan jauh yang setara. Dan kami menyelesaikan prosesnya setelah sandaran terbaik pertama selesai atau mengulangi proses tersebut apabila berlaku kesilapan.
6. Kesimpulannya
Dalam artikel ini, kita secara ringkas mengulas tentang Completable jenis RxJava.
Kami bermula dengan pilihan yang berbeza untuk mendapatkan Completable keadaan dan kemudian dirantai dan terdiri Completables dengan menggunakan andthen (), merge (), flatMapCompletable (), dan amb ... () pengendali.
Kita dapat mencari sumber untuk semua sampel kod di GitHub.