อะไรคือความแตกต่างระหว่าง Observable, Completable และ Single ใน RxJava


114

ใครช่วยอธิบายความแตกต่างระหว่าง Observable, Completable และ Single ใน RxJava พร้อมตัวอย่างที่ชัดเจนได้ไหม

ในสถานการณ์ใดที่เราใช้หนึ่งมากกว่าคนอื่น ๆ ?


คุณเคยมีประสบการณ์อะไรบ้าง?
J. Chomel

เพิ่งเริ่มได้ไม่นาน .. @ J.Chomel
Raja Jawahar

25
นี่เป็นคำถามที่ถูกต้องอย่างสมบูรณ์และไม่ควรถูกปิด แม้ว่า rx จะเป็นไลบรารีที่ยอดเยี่ยม แต่เอกสารและตัวอย่างนั้นแย่มากและน่าสับสน
RunLoop

คำตอบ:


249

Observableเป็นหน่วยการสร้าง ReactiveX ทั่วไปของแหล่งเหตุการณ์ที่ปล่อยค่าเมื่อเวลาผ่านไป (และมีอยู่ในทุกภาษา ReactiveX ที่ขยายไปถึง)
ในเหตุการณ์ที่สังเกตได้สั้น ๆ คือ
onNext * (onCompleted | onError)? / (* ศูนย์หรือมากกว่า? - ศูนย์หรือ 1)

SingleและCompletableเป็นประเภทใหม่ที่เปิดตัวเฉพาะใน RxJava ซึ่งแสดงถึงประเภทที่ลดลงObservableซึ่งมี API ที่กระชับมากขึ้น

SingleแสดงObservableว่าปล่อยค่าเดียวหรือข้อผิดพลาด

CompletableแสดงObservableว่าไม่มีค่า แต่เฉพาะเหตุการณ์เทอร์มินัลonErrorหรือonCompleted

คุณสามารถนึกถึงความแตกต่างเช่นความแตกต่างของวิธีการที่ส่งกลับ:

  • คอลเลกชันของวัตถุ - สังเกตได้

  • วัตถุเดียว - Single

  • และวิธีการที่ไม่ส่งคืนค่า (วิธีโมฆะ) - เสร็จสมบูรณ์

Singleจะเหมาะสมเมื่อคุณมีงานเชิงสังเกตและคุณคาดหวังค่าเดียวเช่นคำขอเครือข่ายซึ่งดำเนินการครั้งเดียวและส่งคืนค่า (หรือข้อผิดพลาด) การโทรผ่านเครือข่ายจะดำเนินการในครั้งเดียวซึ่งหมายความว่าคุณไม่คาดหวังว่าจะส่งคืนค่าเพิ่มเติม ล่วงเวลา. อีกตัวอย่างหนึ่งคือการดำเนินการดึงข้อมูลฐานข้อมูล

Completableเหมาะสมเมื่อคุณมีObservableและคุณไม่สนใจเกี่ยวกับมูลค่าที่เกิดจากการดำเนินการหรือไม่มีเลย ตัวอย่างกำลังอัปเดตแคชเช่นการดำเนินการสามารถทำได้สำเร็จ / ล้มเหลว แต่ไม่มีค่า
อีกตัวอย่างหนึ่งคือการดำเนินการ init ที่รันเป็นเวลานานซึ่งไม่ส่งคืนอะไรเลย อาจเป็นการโทรผ่านเครือข่าย UPDATE / PUT ที่มีตัวบ่งชี้ความสำเร็จเท่านั้น

ไม่ว่าในกรณีใด Completable และ Single ไม่ได้เพิ่มความสามารถใหม่ ๆ แต่กำลังแนะนำ API ที่แข็งแกร่งและรัดกุมมากขึ้นซึ่งจะบอกข้อมูลเพิ่มเติมเกี่ยวกับการดำเนินการเบื้องหลัง Observable ที่ API เปิดเผย

แก้ไข:

RxJava2 Maybe:

RxJava2 เพิ่มรูปแบบใหม่ที่เรียกว่าMaybe, MaybeคือการรวมกันของCompletableและเตียงเดี่ยว

ในภาษาเดียวกันเช่นข้างต้นMaybeสามารถคิดได้ว่าเป็นวิธีการที่ส่งคืน OptionalบางประเภทOptionalคือ wrapper รอบ ๆ Object ที่บอกอย่างชัดเจนว่าเรามีค่าบางอย่างอยู่ในนั้นObjectหรือไม่ (แทนที่จะเป็น null)
ด้วยการMaybeที่เราสามารถมีค่าบางอย่างเหมือนกันSingleหรือมีอะไรกลับมา - Completableเช่นเดียวกับ นอกจากนี้เช่นเดียวกับทั้งสองข้อเรามีข้อผิดพลาด
Maybeมีค่าเมื่อเราต้องการทำเครื่องหมายว่าObservableอาจไม่มีค่าและจะทำให้เสร็จสมบูรณ์
ตัวอย่างจะดึงมาจากแคชเราไม่จำเป็นต้องมีค่าในแคชดังนั้นในกรณีนี้เราจะดำเนินการให้เสร็จสิ้นเนื่องจากเราจะได้รับonNextค่าจากแคช
สิ่งนี้ควรค่าแก่การจัดการกับค่าที่ไม่ใช่ค่าว่างในสตรีมด้วย RxJava2

RxJava2 Flowable:

ก่อนอื่นให้กำหนดแรงดันย้อนกลับ Backpressure เป็นวิธีการจัดการกับสถานการณ์ที่ข้อมูลถูกสร้างขึ้นเร็วกว่าที่จะประมวลผลได้ Flowableมีการรองรับแรงดันย้อนกลับเพื่อให้ล่องขอรายการ คุณสามารถอ่านเพิ่มเติมเกี่ยวกับความแตกต่างที่นี่


2
แล้ว Flowable ล่ะ?
Niraj Chauhan

ดังนั้นถ้าฉันเขียนเป็น Kotlin Maybe<T>โดยพื้นฐานแล้วSingle<T?>คืออะไร?
AAverin

คุณสามารถพิจารณาSingleเป็น a Completablewith return value ได้หรือไม่?
Eido95

14
  1. FlowableและObservableสามารถแสดงถึงกระแสที่ จำกัด หรือไม่มีที่สิ้นสุด แรงดันย้อนกลับที่รองรับได้
  2. Singleคือสตรีมที่มีองค์ประกอบเดียว
  3. อาจเป็นสตรีมที่มี 0 หรือองค์ประกอบเดียว
  4. ในที่สุดCompletable จะแสดงถึงสตรีมที่ไม่มีองค์ประกอบกล่าวคือสามารถทำได้โดยไม่มีค่าหรือล้มเหลวเท่านั้น

คำตอบสั้น ๆ ที่ฉันพบที่นี่ในส่วน RXJava

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.