【问题标题】:RxJava, What happened if I don't call dispose?RxJava,如果我不调用 dispose 会发生什么?
【发布时间】:2017-12-07 05:29:31
【问题描述】:

我的 Android 应用需要支持上传大文件,但我不希望用户等到上传完成。

通常,当我使用 Observable 时,我会在视图被销毁时为它调用 dispose()。

但是在上传的情况下,我无论如何都不能处理它,直到它完成。

所以我想试着喜欢这个,

private val compositeDisposable: CompositeDisposable = CompositeDisposable()

fun upload() {
    val disposable = Observable.just(true).delay(20, TimeUnit.SECONDS).subscribe({
        Log.d("=>", "Upload finished")
        disposeUploader()
    })  

    compositeDisposable.add(disposable)
}

fun disposeUploader() {
    compositeDisposable.clear()
    compositeDisposable.dispose()
}

但问题是 upload() 可能会被多次调用,因此第一个上传者将处理所有其他处理调用。

如果我不调用 dispose 会发生什么?或者完成后有什么方法可以自行处理?

【问题讨论】:

  • But in uploading case, I can not dispose it in any case until it finished. - 你能详细说明为什么不能在这里处理上传案例吗?
  • 因为在上传过程中,如果处理掉了observer,上传就会终止。
  • rxjava2 中的 .subscribe() 不返回 Disposable,而是返回 void。你可能会混淆 rxjava1,它允许.subscribe() 返回Subscription
  • @nhaarman 明白了,只有 subscribe(Observer<? super T> observer) 不会返回 Disposable

标签: android kotlin rx-java


【解决方案1】:

处理Observable 的想法有两个目的:

1) 避免内存泄漏 - 分离可能由正在进行的请求模块持有的视图引用。
2) 释放资源 - 停止正在进行的后台任务以释放不需要的资源,例如,当用户退出您的活动时,请求/处理可能不再相关,因此没有必要让它继续运行。

在您的情况下,您希望您的后台任务(上传文件)恢复,避免 (2),同时让您的视图与它分离 (1)。

您在一段时间后处理的解决方案错过了Observable 将在完成时dispose 本身。此外,您不能假设上传的特定持续时间(最多是超时值)。

RxJava 的解决方案是使用publishshare 等运算符多播Observable,在您的情况下:

val multicastedObservable = uploadObservable.publish()
            .autoConnect()
            .subscriber(//your view related subscriber);

这样,uploadObservable 将首先开始执行subscribe,但在调用dispose 时不会停止,而是会分离对视图的引用。


说了这么多,值得注意的是,如果没有 Android 中的前台服务,您的上传场景将无法可靠地完成。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-02
    • 1970-01-01
    • 2013-04-01
    • 2012-01-13
    • 2011-03-15
    • 1970-01-01
    相关资源
    最近更新 更多