Apa perbedaan antara Observable, Completable dan Single di RxJava

113

Adakah yang bisa menjelaskan perbedaan antara Observable, Completable dan Single di RxJava dengan contoh yang jelas?

Dalam skenario mana kita menggunakan salah satu dari yang lain?

Raja Jawahar
sumber
Apakah Anda pernah mengalami sesuatu?
J. Chomel
Saya baru saja mulai baru-baru ini .. @ J.Chomel
Raja Jawahar
25
Ini adalah pertanyaan yang sangat valid dan seharusnya tidak ditutup. Meskipun rx adalah pustaka yang bagus, dokumentasi dan contoh sayangnya sangat buruk dan membingungkan.
RunLoop

Jawaban:

248

Observableadalah blok penyusun ReactiveX generik, dari sumber peristiwa yang memancarkan nilai dari waktu ke waktu. (dan dengan demikian ada di setiap bahasa yang diperluas ReactiveX ke)
dalam peristiwa singkat yang dapat diamati adalah:
onNext * (onCompleted | onError)? / (* nol atau lebih? - nol atau 1)

Singledan Completablemerupakan tipe baru yang diperkenalkan secara eksklusif di RxJava yang mewakili tipe tereduksi Observable, yang memiliki API lebih ringkas.

Singlemewakili Observableyang memancarkan nilai tunggal atau kesalahan.

Completablemenyatakan Observablebahwa tidak memancarkan nilai, tetapi hanya kejadian terminal, baik onErroratauonCompleted

Anda dapat memikirkan perbedaan seperti perbedaan metode yang mengembalikan:

  • Koleksi Objek - Dapat diamati

  • Objek tunggal - Tunggal

  • dan metode yang tidak mengembalikan nilai (metode kosong) - Dapat diselesaikan.

Singledapat sesuai ketika Anda memiliki berorientasi tugas Dapat diamati dan Anda mengharapkan nilai tunggal, seperti permintaan Jaringan yang dilakukan sekali dan mengembalikan nilai (atau kesalahan), panggilan jaringan dioperasikan dalam mode satu waktu, yang berarti Anda tidak mengharapkannya untuk mengembalikan nilai tambahan lembur. Contoh lainnya adalah operasi data pengambilan DB.

Completablesesuai jika Anda memiliki Observabledan tidak peduli dengan nilai yang dihasilkan dari operasi tersebut, atau tidak ada. Contohnya adalah memperbarui cache misalnya, operasi bisa berhasil / gagal, tetapi tidak ada nilai.
Contoh lain adalah beberapa operasi init yang berjalan lama yang tidak mengembalikan apa pun. Ini bisa berupa panggilan jaringan UPDATE / PUT yang dihasilkan dengan indikasi keberhasilan saja.

Bagaimanapun, Completable dan Single tidak menambahkan kemampuan baru tetapi mereka memperkenalkan API yang lebih kuat dan ringkas, yang memberi tahu lebih banyak tentang operasi di balik Observable yang diekspos oleh API.

Edit:

RxJava2 Maybe:

RxJava2 menambahkan tipe baru yang disebut Maybe, Maybeadalah kombinasi dari Completabledan Tunggal.

Dalam bahasa yang sama seperti di atas, Maybedapat dianggap sebagai metode yang mengembalikan Optionalbeberapa jenis, Optionaladalah pembungkus di sekitar Objek yang secara eksplisit memberi tahu apakah kita memiliki beberapa nilai di dalamnya - Objectatau tidak (bukan null).
Dengan Maybekita dapat memiliki beberapa nilai persis seperti Singleatau tidak mengembalikan apa-apa - sama seperti Completable. Selain itu, seperti keduanya, kami mengalami kesalahan.
Maybebernilai ketika kita ingin menandai bahwa suatu Observablemungkin tidak memiliki nilai dan hanya akan selesai.
Contoh akan diambil dari cache, kita belum tentu memiliki nilai di cache, jadi dalam hal ini, kita akan menyelesaikannya, sekarang kita akan mendapatkan onNextnilai dari cache.
Ini juga layak untuk menangani nilai non-null dalam streaming dengan RxJava2.

RxJava2 Flowable:

Pertama, mari kita definisikan tekanan balik. Backpressure adalah cara menangani situasi di mana data dihasilkan lebih cepat daripada pemrosesannya. Flowablememiliki dukungan backpressure yang memungkinkan downstream untuk meminta item. Anda dapat membaca lebih lanjut tentang perbedaannya di sini .

yosriz
sumber
2
Bagaimana dengan flowable?
Niraj Chauhan
Jadi, jika saya menulis di Kotlin, apakah Maybe<T>pada dasarnya Single<T?>?
AAverin
Bisakah Anda mempertimbangkan Singleuntuk menjadi Completabledengan nilai yang dikembalikan?
Eido95
13
  1. Flowable dan Observable dapat mewakili aliran terbatas atau tak terbatas. Dukungan tekanan balik yang dapat mengalir .
  2. Tunggal adalah aliran dengan satu elemen.
  3. Mungkin aliran dengan 0 atau satu elemen.
  4. Terakhir, Completable mewakili aliran tanpa elemen, yaitu hanya dapat diselesaikan tanpa nilai atau gagal.

Jawaban singkat yang saya temukan di sini di bagian RXJava.

Charith De Silva
sumber