RxJava中的CompositeDisposable是什么?

56
我是一名Android学生,想要学习RxJava。我的问题是“RxJava中的CompositeDisposable是什么?”请详细描述。
4个回答

90

组合式一次性使用的产品使得丢弃(也就是提前取消)更加容易。比如你有一个活动需要同时发出多个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())

然后你可以只进行一次处理调用:

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的方法用于处理该请求。


什么是可处理对象? - Tester
这和将一次性物品存储在列表中有什么区别? - Mateen Ulhaq
除了您无需遍历列表中的所有项即可在 CompositeDisposable 上调用 dispose 之外,没有太多东西。 - Jim Baca
太好了!这样我就可以在添加每个ObservableSingle后,只需一次调用composite.dispose()来处理所有订阅? - Bitwise DEVS

12

CompositeDisposable 就是一个类,用于将所有可回收资源放在同一个位置,这样你就可以一次性将它们全部 dispose 掉。例如:

Disposable disposable1;
Disposable disposable2;
Disposable disposable3;

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

它们都被处理了。


4
"Disposable"的意思是一次性的,即只能使用一次或在短时间内被丢弃的物品。 - Tester
3
这是一个可处理的类接口。Observable、Single、Completable和Maybe都实现了这个接口。为了避免内存泄漏,将观察者处理掉是很重要的。 - Leandro Borges Ferreira
CompositeDisposable和SerialDisposable之间有什么区别? - praveen2034
@praveen2034 compositeDisposable 包含一系列的可处理对象,而 SerialDisposable 是一个可替换或更新为新的可处理对象的单个可处理对象。有关差异的更多详细信息,请参见此处:https://rb.gy/9vir4y - AI I

11

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

您可以使用CompositeDisposable#addCompositeDisposable中添加可处理对象。

不需要逐个调用dispose(),只需调用CompositeDisposable#clear()即可处理已添加的所有对象。如果您要处理所有当前的Disposable并自动处理将来添加的任何Disposable,请调用CompositeDisposable#dispose()。这是有道理的,当您对其调用dispose()时,您实际上正在处理CompositeDisposable,因此添加的任何Disposable都将被处理。


0

除了上述内容,CompositeDisposable 还提供了一致的时间空间复杂度 O(n),无论添加和删除多个可处理对象,当活动或片段被销毁时也会被清除。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接