android - RxJava,如果我不调用 dispose 会发生什么?

标签 android kotlin rx-java

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

通常,当我使用 Observable 时,我会在 View 被销毁时为它调用 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 会发生什么?或者完成后有什么方法可以自行处理?

最佳答案

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

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

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

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

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

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

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


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

关于android - RxJava,如果我不调用 dispose 会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47688218/

相关文章:

android - Textview drawable 不在远程 View 中显示可绘制图像

android - 在 Kotlin 中处理推送通知

android - 如何在一个 fragment 中收集数据并在 android studio 中的另一个 fragment 中显示它,我正在使用共享首选项来执行此操作

kotlin - 为什么在 kotlin 中只能委托(delegate)接口(interface)?

java - 如何在不立即订阅的情况下调用RxJava Observable?

Android:使用 Retrofit 轮询服务器

java - 从抽象类调用非静态方法时遇到问题

android - Google 登录失败 com.google.android.gms.common.api.ApiException : 10:

android - ConstraintLayout的组可见性不会更改其引用 View 的可见性

java - RxJava - 嵌套的 Observables? ( retrofit )