【问题标题】:What is CompositeDisposable in RxJavaRxJava 中的 CompositeDisposable 是什么
【发布时间】:2018-03-21 04:25:31
【问题描述】:

我是一名 Android 学生。我想学习 RxJava。我的问题是“RxJava 中的 CompositeDisposable 是什么?”。请详细描述。

【问题讨论】:

    标签: android rx-java


    【解决方案1】:

    一次性复合材料使处置变得更容易(认为提早取消更容易)。假设您有一个同时发生多个 api 调用的活动:

    var disposable = api.call1(arg1, arg2).subscribe(...)
    var disposable2 = api.call2(arg1).subscribe(...)
    var disposable3 = api.call3().subscribe()
    

    如果您需要提前处置(例如,用户离开活动),那么您需要这样做:

    disposable.dispose()
    disposable2.dispose()
    disposable3.dispose()
    

    如果您改为使用 CompositeDisposable,则可以将所有一次性用品存储在其中。像这样:

    val composite = CompositeDisposable()
    composite.add(api.call1(arg1, arg2).subscribe(...))
    composite.add(api.call2(arg1).subscribe(...))
    composite.add(api.call3().subscribe())
    

    然后你可以进行一次 dispose 调用:

    composite.dispose()
    

    如果你使用的是 kotlin,你可以使用操作符重载来让它看起来更漂亮:

      operator fun CompositeDisposable.plusAssign(disposable: Disposable){
            this.add(disposable)
        }
    

    这使您可以将其表达为:

    val composite = CompositeDisposable()
    composite += api.call1(arg1, arg2).subscribe(...)
    composite += api.call2(arg1).subscribe(...)
    composite += api.call3().subscribe()
    

    Disposable 表示一个请求(认为工作正在完成),并且有一个称为 dispose 的方法来处理该请求。

    【讨论】:

    • 什么是一次性用品?
    • 这与将一次性用品存储在列表中有什么区别?
    • 不多,除了您可以在 CompositeDisposable 上调用 dispose 而不必遍历列表中的所有项目。
    • 这太棒了!因此,在我添加了每个ObservableSingle 之后,我可以像composite.dispose() 这样在一个电话中处理所有订阅?
    【解决方案2】:

    CompositeDisposable 只是一个类,用于将所有一次性物品保存在同一个地方,以便您可以一次性处理所有物品。喜欢:

    Disposable disposable1;
    Disposable disposable2;
    Disposable disposable3;
    
    CompositeDisposable composite = new CompositeDisposable();
    composite.addAll(disposable1, disposable2, disposable3)
    composite.dispose()
    

    所有这些都被处理掉了

    【讨论】:

    • 什么是一次性用品
    • 它是一个可以被释放的类的接口。 Observable、Single、Completable 和 Maybe 都实现了这个接口。处置你的 observables 以避免内存泄漏是很重要的
    • CompositeDisposable 与 SerialDisposable 有什么区别
    • @praveen2034 compositeDisposable 包含一次性用品列表,而SerialDisposable 是一次性用品,可以用新的一次性用品更换或更新。有关差异的更多详细信息在这里:rb.gy/9vir4y
    【解决方案3】:

    CompositeDisposable 是一个方便的类,用于捆绑多个Disposables,以便您可以通过CompositeDisposable 上的一个方法调用来处理它们。

    您可以使用CompositeDisposable#add 将一次性用品添加到CompositeDisposable

    您无需分别对每个Disposable 调用dispose(),而是调用CompositeDisposable#clear() 来处理所有已添加的Disposables。如果您想处置所有当前的Disposables 自动处置将来添加的任何Disposables,请致电CompositeDisposable#dispose()。这是有道理的,当您在其上调用 dispose() 时,您实际上是在处置 CompositeDisposable,因此您添加的任何 Disposables 都会被处置。

    【讨论】:

      【解决方案4】:

      添加到上面的 CompositeDisposable 提供了 O(n) 的一致时间空间复杂度,而不管添加和删除多个一次性用品,当活动或片段被破坏时也会被清除。

      【讨论】:

        猜你喜欢
        • 2017-01-05
        • 2018-09-11
        • 2020-05-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-11
        • 2019-08-06
        • 1970-01-01
        相关资源
        最近更新 更多