Saya tidak mendapatkan alasan untuk menggunakan RxJava di Android dan LiveData dari Android Architecture Components. Akan sangat membantu jika usecases dan perbedaan antara keduanya dijelaskan bersama dengan contoh sampel dalam bentuk kode yang menjelaskan perbedaan antara keduanya.
186
Jawaban:
Android LiveData adalah varian dari pola pengamat asli, dengan tambahan transisi aktif / tidak aktif. Karena itu, ruang lingkupnya sangat terbatas.
Menggunakan contoh yang dijelaskan dalam Android LiveData , kelas dibuat untuk memantau data lokasi, dan mendaftar dan membatalkan pendaftaran berdasarkan status aplikasi.
RxJava menyediakan operator yang jauh lebih umum. Mari kita asumsikan bahwa yang dapat diamati ini akan memberikan data lokasi:
Implementasi yang dapat diamati dapat dibangun menggunakan
Observable.create()
untuk memetakan operasi panggilan balik. Ketika observable berlangganan, panggilan balik terdaftar, dan ketika berhenti berlangganan, panggilan balik tidak terdaftar. Implementasinya terlihat sangat mirip dengan kode yang diberikan dalam contoh.Mari kita juga berasumsi bahwa Anda memiliki pengamatan yang memancarkan true ketika aplikasi aktif:
Kemudian Anda dapat memberikan semua fungsionalitas LiveData dengan yang berikut ini
The
switchMap()
Operator baik akan menyediakan lokasi saat ini sebagai sungai, atau apa-apa jika aplikasi tersebut tidak aktif. Setelah AndaliveLocation
dapat mengamati, ada banyak hal yang dapat Anda lakukan dengan menggunakan operator RxJava. Contoh favorit saya adalah:Itu hanya akan melakukan tindakan ketika lokasi berubah, dan lokasinya menarik. Anda dapat membuat operasi serupa yang menggabungkan operator waktu untuk menentukan kecepatan. Lebih penting lagi, Anda dapat memberikan kontrol terperinci tentang apakah operasi terjadi di utas utama, atau utas latar belakang, atau beberapa utas, menggunakan operator RxJava.
Maksud dari RxJava adalah bahwa ia menggabungkan kontrol dan pengaturan waktu ke dalam satu semesta, menggunakan operasi yang disediakan dari perpustakaan, atau bahkan operasi kustom yang Anda sediakan.
LiveData hanya membahas satu bagian kecil dari alam semesta itu, setara dengan membangun
liveLocation
.sumber
The point of RxJava is that it combines control and timing into a single universe, using operations provided from the library, or even custom operations that you provide.
Tetapi tidakkah siklus hidup LiveData sadar. Jika kita menggunakan Rx, bukankah kita harus menangani perubahan siklus hidup?Mengenai pertanyaan awal, RxJava dan LiveData saling melengkapi dengan sangat baik.
LiveData
bersinar pada lapisan ViewModel, dengan integrasi yang erat dengan siklus hidup Android danViewModel
.RxJava
memberikan lebih banyak kemampuan dalam transformasi (seperti yang disebutkan oleh @ Bob Dalgleish).Saat ini, kami menggunakan
RxJava
sumber data dan lapisan repositori, dan itu diubah menjadiLiveData
(menggunakanLiveDataReactiveStreams
) di ViewModels (sebelum mengekspos data ke aktivitas / fragmen) - cukup senang dengan pendekatan ini.sumber
observeOn
,LiveDataReactiveStreams
tetap melakukannya dengan meneleponLiveData.postValue()
. Dan tidak ada jaminan AndasubscribeOn
akan memiliki efek secara umum.Ada banyak perbedaan antara LiveData dan RxJava:
sumber
onCleared
.Bahkan,
LiveData
bukan alat dasarnya berbeda untukRxJava
, jadi mengapa itu diperkenalkan sebagai komponen arsitektur saatRxJava
bisa dengan mudah dikelola siklus hidup dengan menyimpan semua langganan untuk diamati dalamCompositeDispoable
objek dan kemudian membuang mereka dionDestroy()
satuActivity
atauonDestroyView()
dariFragment
hanya menggunakan satu baris kode?Saya telah menjawab pertanyaan ini sepenuhnya dengan membangun aplikasi pencarian film sekali menggunakan RxJava dan kemudian menggunakan LiveData di sini .
Namun singkatnya, ya, itu bisa, tetapi itu perlu terlebih dahulu mengesampingkan metode siklus hidup yang relevan selain memiliki pengetahuan siklus hidup dasar. Ini mungkin masih tidak masuk akal bagi sebagian orang, tetapi kenyataannya adalah bahwa menurut salah satu sesi Jetpack di Google I / O 2018 banyak pengembang menemukan kompleks manajemen siklus hidup. Kesalahan kecelakaan yang timbul karena tidak menangani ketergantungan siklus mungkin merupakan tanda lain bahwa beberapa pengembang, bahkan jika mengetahui siklus hidup, lupa untuk mengurusnya di setiap Aktivitas / Fragmen yang mereka gunakan dalam aplikasi mereka. Dalam aplikasi besar ini bisa menjadi masalah, meskipun ada efek negatif pada produktivitas.
Intinya adalah bahwa dengan memperkenalkan
LiveData
, sejumlah besar pengembang diharapkan untuk mengadopsi MVVM tanpa harus memahami manajemen siklus hidup, kebocoran memori, dan kerusakan. Meskipun saya tidak ragu bahwaLiveData
itu tidak dapat dibandingkan denganRxJava
dalam hal kemampuan dan kekuatan yang diberikannya kepada pengembang, pemrograman reaktif danRxJava
merupakan konsep dan alat yang sulit dipahami bagi banyak orang. Di sisi lain, saya tidak berpikirLiveData
dimaksudkan untuk menjadi penggantiRxJava
- itu tidak bisa - tetapi alat yang sangat sederhana untuk menangani masalah kontroversial yang tersebar luas yang dialami oleh banyak pengembang.** PEMBARUAN ** Saya telah menambahkan artikel baru di sini di mana saya telah menjelaskan bagaimana penyalahgunaan LiveData dapat menyebabkan hasil yang tidak terduga. RxJava bisa datang untuk menyelamatkan dalam situasi ini
sumber
LiveData
akan membuangonStop
sebenarnyaSeperti yang mungkin Anda ketahui dalam ekosistem reaktif, kami memiliki Observable yang memancarkan data dan Observer yang berlangganan (mendapatkan pemberitahuan) dari emisi yang Dapat Diamati ini, tidak ada yang aneh adalah cara kerjanya yang disebut Pola Observer. Suatu "teriakan" sesuatu yang Dapat Diobservasi, Pengamat mendapat pemberitahuan bahwa Observable meneriakkan sesuatu pada saat tertentu.
Berpikirlah
LiveData
sebagai Pengamat yang memungkinkan Anda untuk mengelola Pengamat yang berada dalamactive
keadaan. Dalam istilah lainLiveData
adalah Observable sederhana tetapi juga menjaga siklus hidup.Tapi mari kita lihat dua kasus kode yang Anda minta:
A) Data Langsung
B) RXJava
A) Ini adalah implementasi dasar LiveData
1) Anda biasanya instantiate LiveData di ViewModel untuk mempertahankan perubahan orientasi (Anda dapat memiliki LiveData yang hanya baca, atau MutableLiveData yang dapat ditulis, sehingga Anda biasanya mengekspos luar dari kelas LiveData)
2) dalam
OnCreate
metode Aktivitas Utama (bukan ViewModel) Anda "berlangganan" objek Observer (biasanya metode onChanged)3) Anda meluncurkan metode mengamati untuk membuat tautan
Pertama
ViewModel
(memiliki logika bisnis)Dan ini adalah
MainActivity
(sebodoh mungkin)B) Ini adalah implementasi dasar RXJava
1) Anda mendeklarasikan Observable
2) Anda mendeklarasikan Pengamat
3) Anda berlangganan Observable dengan Observer
Khususnya
LiveData
digunakan denganLifecycle
dan sering denganViewModel
(seperti yang telah kita lihat) komponen arsitektur. Bahkan ketikaLiveData
dikombinasikan dengan ViewModel memungkinkan Anda untuk terus diperbarui secara real time setiap perubahan dalam Pengamat, sehingga acara dikelola secara real time di mana diperlukan. Untuk menggunakanLiveData
sangat disarankan untuk mengetahui konsep siklus hidup dan objek relatif LifeCycleOwner / LifeCycle , juga saya akan menyarankan Anda untuk melihat Transformasi , jika Anda ingin menerapkanLiveData
dalam skenario kehidupan nyata. Di sini Anda dapat menemukan beberapa use case dari commonsware hebat .Untuk menyelesaikan pada dasarnya
LiveData
adalah cara yang disederhanakanRXJava
, elegan untuk mengamati perubahan di banyak komponen tanpa membuat aturan ketergantungan yang disebut antar komponen secara eksplisit, sehingga Anda dapat menguji kode dengan lebih mudah dan membuatnya lebih mudah dibaca. RXJava, memungkinkan Anda untuk melakukan hal-hal LiveData dan banyak lagi. Karena fungsi yang diperluas dari RXJava, Anda berdua dapat menggunakan LiveData untuk kasus-kasus sederhana atau memanfaatkan semua kekuatan RXJava tetap menggunakan komponen Arsitektur Android sebagai ViewModel , tentu saja ini berartiRXJava
jauh lebih rumit, anggap saja ada ratusan operator sebagai gantinya. SwitchMap dan Peta LiveData (saat ini).RXJava versi 2 adalah perpustakaan yang merevolusi paradigma Berorientasi Objek, menambahkan cara fungsional yang disebut untuk mengelola aliran program.
sumber
LiveData adalah subset dari komponen arsitektur android yang dikembangkan oleh tim android.
Dengan data langsung dan komponen arsitektur lainnya, kebocoran memori dan masalah serupa lainnya ditangani oleh komponen arsitektur. Karena dikembangkan oleh tim android, ini adalah yang terbaik untuk android. Mereka juga menyediakan pembaruan yang menangani versi baru Android.
Jika Anda hanya ingin menggunakannya dalam pengembangan aplikasi Android, pilih komponen arsitektur Android. Jika tidak, jika Anda ingin menggunakan aplikasi Java lainnya, seperti aplikasi web, aplikasi desktop, dll., Gunakan RxJava
sumber
LiveData
sebagai pemegang data hal dan tidak ada yang lain. Kami juga bisa mengatakan LiveData adalah konsumen yang sadar siklus hidup.LiveData
sangat disarankan untuk mengetahui konsep siklus hidup dan objek relatif LifeCycleOwner / LifeCycle, Anda mendapatkan transformasi dan kemampuan streaming untuk logika bisnis Anda dan operasi sadar siklus untuk UI Anda.Rx adalah alat yang ampuh yang memungkinkan untuk memecahkan masalah dalam gaya deklaratif yang elegan. Ini menangani opsi sisi bisnis atau operasi Service Api
sumber
Membandingkan LiveData dengan RxJava membandingkan apel dengan salad buah.
Bandingkan LiveData dengan ContentObserver dan Anda membandingkan apel dengan apel. LiveData secara efektif menjadi pengganti yang sadar siklus hidup untuk ContentObserver.
Membandingkan RxJava dengan AsyncTask atau alat threading lainnya membandingkan salad buah dengan jeruk, karena RxJava membantu dengan lebih dari sekadar threading.
sumber
LiveData sebagian sama dengan Rx Subject atau SharedRxObservable
LiveData mengelola siklus berlangganan, tetapi berlangganan Subjek Rx harus dibuat dan dibuang secara manual
LiveData tidak memiliki status terminasi tetapi Subjek Rx memiliki OnError dan OnCompleted
sumber