我的 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 的解决方案是使用 publish
和 share
等运算符多播您的 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/