📜  RxJava 中的 Observable 类型

📅  最后修改于: 2022-05-13 01:55:49.973000             🧑  作者: Mango

RxJava 中的 Observable 类型

在模型视图范式中,此类表示可观察对象或“数据”。它可以被子类化以表示应用程序希望观看的对象。问题是您正在创建的软件将渲染描述二维三维场景的数据。应用程序必须是模块化的,并允许同一场景的多个并发视图。

一个或多个观察者可以分配给一个可观察对象。观察者可以是任何实现观察者接口的对象。当一个 observable 实例发生变化时,调用 Observable 的notifyObservers()方法的应用程序通过调用它们的 update 方法通知所有观察者发生变化。

图 1. RxJava 中的 Observable 解释。

简单来说,

  • 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是例外。

单独<>单一观察者



当 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,然后将其用作您采购的用例。

想要一个更快节奏和更具竞争力的环境来学习 Android 的基础知识吗?
单击此处前往由我们的专家精心策划的指南,旨在让您立即做好行业准备!