2017-12-07 9 views
2

큰 파일을 업로드하려면 내 Android 앱이 지원해야하지만 업로드가 완료 될 때까지 사용자가 기다리지 않기를 바랍니다.RxJava, 처분하지 않으면 어떻게됩니까?

일반적으로 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() 
} 

생각하고 있었다 그러나 문제는 업로드입니다() 최초의 업 로더가 다른 모든 처리 호출을 처리 할 수 ​​있도록, 여러 번 호출 할 수있다.

처분을하지 않으면 어떻게됩니까? 또는 그것이 완료되었을 때 그 자체를 버리는 어떤 방법이 있습니까? - 지속적으로 요청 모듈에 의해 유지 될 수 분리보기 참조

1) 않도록 메모리 누수 :

+0

그러나 업로드 할 때 어떤 경우에도 처리가 끝날 때까지 처리 할 수 ​​없습니다. "- 업로드 케이스를 여기서 처리 할 수없는 이유를 자세히 설명해 주시겠습니까? –

+0

업로드하는 동안 관찰을 처분하면 업로드가 종료됩니다. –

+0

rxjava2의'.subscribe()'는 Disposable을 리턴하지 않고 대신 void를 리턴합니다. rxjava1과 혼동하여'구독 '을 반환하는'.subscribe()'를 허용합니까? –

답변

3

Observable을 배치의 개념은 두 가지 목적을 제공합니다.
2) 해제 자원 - 불필요한 자원을 제거하기 위해 진행중인 백그라운드 작업을 중지하십시오. 예를 들어 사용자가 활동을 종료 할 때 요청/처리가 더 이상 관련이 없으므로 계속 실행하지 않아도됩니다.

배경 작업 (파일 업로드)을 다시 시작하고 (2) 회피하고 (1)보기를 분리하려는 경우에 유용합니다.

당신의 해결책은 Observable과 같은 시점을 놓치면 얼마되지 않아 완료 될 때 dispose가됩니다. 또한 업로드의 특정 지속 시간을 가정 할 수 없습니다 (최대 제한 시간 값).

RxJava와 솔루션은 귀하의 경우, publishshare 같은 연산자를 사용하여 Observable가 멀티 캐스팅되어

:

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

이 방법 uploadObservablesubscribe 처음 실행을 시작하지만 호출 될 때 dispose 멈추지 않을 것입니다 만, 오히려보기에 대한 참조를 분리합니다.


모든 것을 언급 했으므로 Android에서 전경 서비스를 사용하지 않으면 업로드 시나리오를 안정적으로 수행 할 수 없습니다.