RxJava,如果我不打电话怎么办?

时间:2017-12-07 05:29:32

标签: 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()
}

但问题是upload()可以被多次调用,所以第一个上传器会处理所有其他处理调用。

如果我不打电话怎么办?或者在完成后是否有任何处理方式?

1 个答案:

答案 0 :(得分:4)

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

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

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

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

使用RxJava的解决方案是使用Observablepublishshare运算符组播您的val multicastedObservable = uploadObservable.publish() .autoConnect() .subscriber(//your view related subscriber);

uploadObservable

这样,subscribe将在第一个dispose开始执行,但在调用{{1}}时不会停止,而是将对视图的引用分离。

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