RxJava,如果不调用销毁怎么办?

Exp*_* be 6 android kotlin rx-java

我的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()
}
Run Code Online (Sandbox Code Playgroud)

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

如果不打电话给我怎么办?还是在完成时有任何处置方式?

yos*_*riz 7

部署a的想法有Observable两个目的:

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

在您的情况下,您希望后台任务(上传文件)继续执行,避免(2),同时将视图从中分离出来(1)。

你的一段时间后处置解决方案不得要领如Observabledispose在完成自身。此外,您不能假设上传的持续时间(最多是超时值)。

RxJava的解决方案是在您的情况下Observablepublish和一样多播您的使用运算符share

val multicastedObservable = uploadObservable.publish()
            .autoConnect()
            .subscriber(//your view related subscriber);
Run Code Online (Sandbox Code Playgroud)

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


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