我的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()可以被多次调用,所以第一个上传器会处理所有其他处理调用。
如果我不打电话怎么办?或者在完成后是否有任何处理方式?
答案 0 :(得分:4)
处理Observable
的想法有两个目的:
1)避免内存泄漏 - 分离正在进行的请求模块可能持有的视图引用。
2)释放资源 - 停止正在进行的后台任务以释放不需要的资源,例如,当用户退出您的活动时,请求/处理可能不再相关,因此无需继续运行。
在您的情况下,您希望您的后台任务(上传文件)恢复,避免(2),同时让您的视图与其分离(1)。
您在一段时间后处置的解决方案将错过Observable
dispose
本身完成后的点。而且,您不能假设上传的特定持续时间(最多是超时值)。
使用RxJava的解决方案是使用Observable
和publish
等share
运算符组播您的val multicastedObservable = uploadObservable.publish()
.autoConnect()
.subscriber(//your view related subscriber);
:
uploadObservable
这样,subscribe
将在第一个dispose
开始执行,但在调用{{1}}时不会停止,而是将对视图的引用分离。
说了这么多,值得注意的是,如果没有Android中的前台服务,您的上传方案无法可靠地完成。