Apa yang baru di RxJava 3

Pada musim semi tahun 2020, versi baru kerangka kerja RxJava , RxJava 3, dirilis. Mari kita lihat apa perubahan utamanya, bagaimana Anda dapat beralih dari RxJava 2 ke versi baru, dan apakah layak untuk bermigrasi sama sekali.



Perhatikan bahwa tidak ada perubahan global dalam versi baru, tetapi dukungan untuk Java 8 telah muncul, dan perpustakaan menjadi lebih nyaman untuk digunakan.







Penafian: Artikel ini didasarkan pada ulasan GitHub , di samping itu, kami berbagi kesan pengembang mobile kami tentang RxJava 3, tetapi kami tidak berpura-pura menjadi studi yang lengkap - karena versi baru dirilis baru-baru ini dan belum ada banyak pengalaman praktis. Jika Anda memiliki tambahan, tulis di komentar, dengan senang hati kami akan mendiskusikan)



Perubahan utama dalam RxJava 3



Jadi apa yang kita lihat dalam RxJava 3 :



  • Versi dasar Java sekarang meningkat menjadi 8 *;
  • Ada dukungan untuk fitur bahasa seperti:


- Streams

- Stream Collectors

- Opsional

- CompletableFeature



* Untuk menggunakan Java8 API, Anda perlu menaikkan minSDK ke versi 24.



Pada gilirannya, pengembang menghapus dukungan untuk fitur seperti:



  • java.time.Duration - menghasilkan banyak kelebihan, selalu dapat diganti dengan waktu + unit;
  • java.util.function - Tidak bisa melempar pengecualian, dan kelebihan dapat membuat "ambiguitas" yang tidak perlu.


Struktur paket juga telah berubah:







Perubahan yang disajikan dapat dibagi menjadi 2 kelompok:



  1. Perubahan perilaku
  2. Perubahan API


Perubahan perilaku



  • Semua kesalahan akan diproses


Sebelumnya, salah satu masalah dengan RxJava 2 adalah bahwa dalam beberapa kasus, kesalahan bisa hilang dan tidak ditangani. Sekarang, di RxJava 3, berhenti berlangganan dari sumber yang mungkin menimbulkan kesalahan memicu kesalahan ini untuk dilemparkan ke penangan kesalahan umum melalui RxJavaPlugins.onError ()







  • Connectable.reset ()


Ada masalah sumber air panas di RxJava 2: ketika menerima acara terminal ConnectableObservable, koneksi baru mengabaikan semua elemen dan hanya menerima acara terminasi.



RxJava 3 memperkenalkan fungsi untuk mereset keadaan ConnectableObservable menggunakan fungsi reset () untuk memungkinkan pelanggan yang baru terhubung untuk memproses data.











  • Kemampuan untuk menghentikan Flowable.publish


Dalam RxJava 3, setelah sejumlah nilai diterima, Flowable.publish dihentikan sementara dan elemen lainnya tersedia untuk pelanggan berikutnya.







  • Parameter Processor.ofer () nol


Jika Anda mencoba memanggil PublishProcessor.offer (), BehaviourProcessor.offer (), atau MulticastProcessor.offer () dan lulus nol, NullPointerException dilempar alih-alih memberikan kesalahan kepada penangan onError, dan status terminal dipicu.







  • CompositeException.getCause ()


Sebelumnya di RxJava 2, metode getCause () kadang-kadang adalah beban memori yang signifikan, memanggil metode initCause pada setiap pengecualian, tidak stabil, dan tidak selalu membuang rantai pengecualian.



Dalam versi baru, metode ini telah diubah secara internal dan sekarang menghasilkan rantai kesalahan dalam bentuk jejak tumpukan - dengan memformat string yang sederhana.











  • Mengubah pengecualian validasi parameter


Jika parameter tidak valid, beberapa operator sekarang akan membuang IllegalArgumentException alih-alih IndexOutOfBoundsException:



- skip

- skipLast

- takeLast

- takeLast - takeLastTimed



  • Sumber pra-penutupan untuk fromX ()


Pustaka fromAction () dan fromRunnable () telah menjadi konsisten dengan sisa panggilan fromX (). Callback fromRunnable () dan fromAction () sekarang akan ditutup secara instan saat dipanggil. Dalam RxJava 2, operator ini ditutup setelah akhir eksekusi tubuh lambda diteruskan ke parameter.







  • Urutan pembersihan sumber daya saat menggunakan menggunakan ()


Pernyataan using () memiliki parameter yang bertanggung jawab ketika sumber daya yang digunakan akan dibersihkan (true - sebelum selesai, false - after). Di versi awal perpustakaan, parameter ini diabaikan, dan sumber daya selalu dibersihkan sebelum mendapatkan status terminal, tetapi dalam RxJava 3 semuanya bekerja dengan benar.







Perubahan API



  • Penanganan pengecualian antarmuka fungsional dari versi baru perpustakaan telah diperluas dari Exception ke Throwable


  • Jenis baru: Pemasok


Dalam RxJava 3, karena ekstensi pengecualian antarmuka fungsional dari Exception ke Throwable, jenis Pemasok baru diperkenalkan - analog dari Callable, tetapi dengan throws Throwable







  • Dalam RxJava 3, operator untuk mengkonversi satu sumber data ke yang lain telah diubah menjadi konverter tertentu










  • Komponen yang dipindahkan


Karena kenyataan bahwa RxJava3 akan mendukung Java8 API, solusi baru telah datang untuk menggantikan kelas pabrik individu: metode pabrik ini telah menjadi metode statis dari antarmuka Disposable.



Seperti sebelumnya:







Sekarang:





  • Untuk mengurangi peringatan, kelas DisposableContainer yang digunakan di dalam CompositeDisposable dijadikan bagian dari API publik
  • Beberapa operator di RxJava 2 berada pada tahap percobaan, dan pada versi ketiga mereka menjadi operator standar:


Flowable promotions



dematerialize(Function)



Observable promotions

dematerialize(Function)



Maybe promotions



doOnTerminate(Action)

materialize()



Single promotions



dematerialize(Function)

materialize()



Complectable promotions



delaySubscription(long, TimeUnit)

delaySubscription(long, TimeUnit, Scheduler)

materialize()







































  • fromX()-




















Flowable

startWith(MaybeSource)

startWith(SingleSource)

startWith(ComplectableSource)



Observable

startWith(MaybeSource)

startWith(SingleSource)

startWith(ComplectableSource)



Maybe

startWith(Publisher)

startWith(ObservableSource)

startWith(MaybeSource)

startWith(SingleSource)

startWith(ComplectableSource)



Single

startWith(Publisher)

startWith(ObservableSource)

startWith(MaybeSource)

startWith(SingleSource)

startWith(ComplectableSource)



Complectable

startWith(MaybeSource)

startWith(SingleSource)































Java8





Menambahkan operator baru dari Opsional () untuk Flowable, Observable dan Maybe





Menambahkan operator baru dari Stream () untuk Flowable dan Dapat Diamati









Menambahkan operator baru dari CompletionStage () untuk semua lima jenis sumber data









Menambahkan operator peta baru Opsional () untuk Flowable, Observable, Maybe dan Single. Ini hanya memungkinkan nilai-nilai yang tidak kosong lewat.







Menambahkan operator blockingStream () baru untuk Flowable dan Observable. Operator mewakili aliran data sebagai aliran, sementara itu disarankan untuk menutup aliran setelah selesai bekerja dengannya untuk mencegah semua jenis kebocoran.







Ditambahkan operator baru flatMapStream () danconcatMapStream () untuk Flowable dan Observable - memungkinkan setiap item dikonversikan menjadi aliran yang terpisah.







Ditambahkan operator baru flattenStreamAsFlowable () dan flattenStreamAsObservable () untuk Mungkin dan Tunggal - setara flatMapStream () operator untuk Observable and Flowable







Apa yang diganti namanya





API



Maybe.toSingle (), pengganti - Maybe.defaultIfEmpty ()

berlangganan (..., ..., ...,), pengganti - doOnSubscribe ()

Single.toCompletable (), pengganti - Single.ignoreElement ()

Completable.blockingGet (), pengganti - Completable .blockingAwait ()

replay (Scheduler), ganti - observOn (Scheduler)

dematerialize (), ganti - deserialize (Fungsi)

padaExceptionResumeNext (), ganti - onErrorResumeNext (Fungsi)

menggabungkanLatest () (dengan parameter vararg), ganti - kombinasikanLatestArray ()

fromFuture () (dengan parameter Penjadwal), penggantian - berlangganan ()

concatMapIterable () (dengan parameter buffer), penggantian - concatMapIterable (Fungsi)



Juga menghapus metode berikut dari TestSubscriber dan TestObserver:







Cara bermigrasi



Banyak pengembang mencatat bahwa bermigrasi dari RxJava 2 ke RxJava 3 adalah proses yang agak melelahkan. Ada dua opsi untuk melakukan transisi:



  • memiliki kedua versi perpustakaan di proyek Anda;
  • melakukan migrasi penuh ke RxJava 3, sementara Anda dapat menggunakan perpustakaan khusus .


Jadi bagaimana cara bermigrasi:



  • Untuk memperbarui pekerjaan dengan API - gunakan analog dari metode RxJava 2 yang telah berubah.
  • Penting untuk mempertimbangkan bahwa beberapa perpustakaan pihak ketiga masih "duduk" di RxJava 2. Untuk menyederhanakan transisi, Anda dapat menggunakan RxJavaBridge , yang menyembunyikan sebagian besar migrasi di bawah tenda.
  • Retrofit RxJava3CallAdapterFactory .




Kami telah meninjau apa yang baru di RxJava 3. Dan sekarang mari kita coba menjawab pertanyaan utama - apakah layak bermigrasi sama sekali?



RxJava 3 secara praktis merupakan peningkatan API. Karena kenyataan bahwa tidak ada perubahan mendasar, secara umum tidak perlu bermigrasi ke versi terbaru sekarang. Transisi itu sendiri membutuhkan upaya, sementara banyak perpustakaan pihak ketiga masih terkait dengan RxJava 2, untuk bekerja dengan Java8, Anda juga perlu menaikkan minSDK ke versi 24. Beberapa tim juga menawarkan solusi alternatif, seperti menggunakan Kotlin Coroutines.



Namun, perlu dicatat bahwa RxJava 2 sekarang masuk ke mode "pemeliharaan", yang berarti bahwa hanya akan ada perbaikan bug dari pembaruan. Dukungan untuk versi kedua diharapkan berakhir pada 28 Februari 2021.



! , .



All Articles