RxJava 中的 Observable 类型
在模型视图范式中,此类表示可观察对象或“数据”。它可以被子类化以表示应用程序希望观看的对象。问题是您正在创建的软件将渲染描述二维三维场景的数据。应用程序必须是模块化的,并允许同一场景的多个并发视图。
一个或多个观察者可以分配给一个可观察对象。观察者可以是任何实现观察者接口的对象。当一个 observable 实例发生变化时,调用 Observable 的notifyObservers()方法的应用程序通过调用它们的 update 方法通知所有观察者发生变化。
简单来说,
- Observable类似于广播值的扬声器。它执行各种任务并生成一些值。
- 运算符类似于转换器,因为它将数据从一种形式转换/修改为另一种形式。
- Observer是获取值的对象。
RxJava 中的可观察类型
RxJava 中的多种 Observable 类型如下:
- 可观察的
- 流动的
- 单身的
- 也许
- 可完成
让我们开始在 RxJava 中创建一些 Observable 以更好地理解这一点,
类型 #1:创建一个基本的 Observable
用例:假设你正在下载一个文件,需要推送下载的当前状态。在这种情况下,您将不得不发出多个值。
Kotlin
fun downloadObserervable(): Observable {
return Observable.create { gfgshooter ->
// Declaring an emitter in name of gfgshooter.
// Beginning the task (in this case a simple download)
// Your code...
if (!gfgshooter.isDisposed) {
// emit the progress
gfgshooter.onNext(20)
}
// Still Downloading
if (!gfgshooter.isDisposed) {
// send progress
gfgshooter.onNext(80)
}
// Progress 100, Download Over
if (!gfgshooter.isDisposed) {
// send progress
gfgshooter.onNext(100)
// send onComplete
gfgshooter.onComplete()
}
}
}
Kotlin
fun getObserver(): Observer {
return object : Observer {
override fun onStart(d: Disposable) {
// Observation Started
// A sample editText
editText.setText("onStart")
}
override fun onNext(progress: Int) {
// Progress Updated
editText.setText("onNext : $progress")
}
override fun onError(e: Throwable) {
// Error Thrown
editText.setText("onError : ${e.message}")
}
override fun onComplete() {
// Observation Complete
editText.setText("onComplete")
}
}
}
Kotlin
fun singleObservable(): Single {
return Single.create { emitter ->
// any code which has a task
if (!gfgEmitter.isDisposed) {
gfgEmitter.onSuccess("Spandan's Code Ran!")
}
}
}
Kotlin
fun singleObservable(): SingleObserver {
return object : SingleObserver {
override fun onSubscribe(d: Disposable) {
edittext.setText("onStart")
}
override fun onSuccess(data: String) {
// Successfully Executed
editText.setText("onSuccess : $data")
}
override fun onError(e: Throwable) {
// Error or Exception thrown.
editText.setText("onError : ${e.message}")
}
}
}
Kotlin
fun maybeObservable(): Maybe {
return Maybe.create { gfgemitter ->
// your code goes here
if (!gfgemitter.isDisposed) {
gfgemitter.onSuccess("Spandan's Code!")
}
}
}
Kotlin
fun completeObservable(): Completable {
return Completable.create { gfgemitter ->
// your code here
if (!gfgemitter.isDisposed) {
gfgemitter.onComplete()
}
}
}
Kotlin
fun completeObservable(): gfgObserver {
return object : gfgObserver {
override fun onStart(d: Disposable) {
// Started
editText.setText("Started")
}
override fun onError(e: Throwable) {
// Exception Thrown
editText.setText("onError : ${e.message}")
}
override fun onComplete() {
// Completed
editText.setText("Done")
}
}
}
类型 #2:使用 Observable 创建一个复杂的观察者
科特林
fun getObserver(): Observer {
return object : Observer {
override fun onStart(d: Disposable) {
// Observation Started
// A sample editText
editText.setText("onStart")
}
override fun onNext(progress: Int) {
// Progress Updated
editText.setText("onNext : $progress")
}
override fun onError(e: Throwable) {
// Error Thrown
editText.setText("onError : ${e.message}")
}
override fun onComplete() {
// Observation Complete
editText.setText("onComplete")
}
}
}
观察者<>可流动
当 Observable 发出大量无法被 Observer 吸收的值时,Flowable 就会发挥作用。在这种情况下,Observable 必须根据策略跳过一些数据,否则会抛出异常。 Flowable Observable 使用一种策略来处理异常。 BackPressureStrategy是策略,而MissingBackPressureException是例外。
Geek Tip: Just like type #1, you can create Flowable using Flowable.create() similarly.
单独<>单一观察者
当 Observable 必须只发出一个值时,例如对网络请求的响应,使用 Single。
类型 #3:创建单个 Observable
科特林
fun singleObservable(): Single {
return Single.create { emitter ->
// any code which has a task
if (!gfgEmitter.isDisposed) {
gfgEmitter.onSuccess("Spandan's Code Ran!")
}
}
}
然后按以下方式将其与单个 observable 一起使用:
科特林
fun singleObservable(): SingleObserver {
return object : SingleObserver {
override fun onSubscribe(d: Disposable) {
edittext.setText("onStart")
}
override fun onSuccess(data: String) {
// Successfully Executed
editText.setText("onSuccess : $data")
}
override fun onError(e: Throwable) {
// Error or Exception thrown.
editText.setText("onError : ${e.message}")
}
}
}
也许<>观察者
当 Observable 必须发出值或没有值时,可能会使用。
类型#4:创建一个可能的观察者
科特林
fun maybeObservable(): Maybe {
return Maybe.create { gfgemitter ->
// your code goes here
if (!gfgemitter.isDisposed) {
gfgemitter.onSuccess("Spandan's Code!")
}
}
}
Completable <> CompletableObserver
当 Observable必须在不发出值的情况下完成某些工作时,它被称为 Completable。
类型 #5:创建一个 Completable Observer
科特林
fun completeObservable(): Completable {
return Completable.create { gfgemitter ->
// your code here
if (!gfgemitter.isDisposed) {
gfgemitter.onComplete()
}
}
}
现在按以下方式使用它:
科特林
fun completeObservable(): gfgObserver {
return object : gfgObserver {
override fun onStart(d: Disposable) {
// Started
editText.setText("Started")
}
override fun onError(e: Throwable) {
// Exception Thrown
editText.setText("onError : ${e.message}")
}
override fun onComplete() {
// Completed
editText.setText("Done")
}
}
}
结论
该类将视图的属性(它以文本方式显示模型当前状态的值)与控制器(它允许用户为模型状态输入新值)相结合。在本文的帮助下,您现在已经知道如何以您想要的任何方式创建一个 Observable,然后将其用作您采购的用例。