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:
- Perubahan perilaku
- 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()
- concatMap() Schedulerβ
- blockingSubscribe() Maybe, Single Completable
- onErrorComplete()
- onErrorResumeWith() Completable
- retryUntil() Single Completable
- switchOnNext() switchOnNextDelayError() Maybe, Single Completable
- dematerialize() Maybe
- fromX()-
- timeInterval() Maybe Single
- toFuture() Maybe Completable
- ofType() Maybe Single
- doOnLifecycle() Maybe, Single Completable
- concatMapX() (X β ) Maybe Single
- concatDelayError() Maybe, Single Completable
- mergeArray() Single
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)
- onErrorReturn() Completable
- safeSubscribe() Maybe, Single Completable
- flatMap() Single
- concatEager() concatEagerDelayError() Flowable, Observable, Maybe Single
- fromSupplier()
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
- Alih-alih startWith () - startWithArray () , startWithIterable () , startWithItem ()
- Alih-alih onErrorResumeNext () - onErrorResumeWith ()
- Alih-alih zipIterable () - zip ()
- Alih-alih menggabungkanLatest () (dengan argumen array) - kombinasikanLatestArray () , kombinasikanLatestArrayDelayError ()
- Alih-alih Single.equals () - sequenceEqual (SingleSource, SingleSource)
- Maybe.flatMapSingleElement() β Maybe.flatMapSingle()
- Callable β Supplier ( )
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.
! , .