2017-12-07 16 views
2

大きなファイルをアップロードするにはAndroidアプリがサポートする必要がありますが、アップロードが完了するまでユーザーが待たされることはありません。RxJava、disposeを呼び出さないとどうなりますか?

通常、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()'が 'Subscription'を返すことを許可しますか? –

答えて

3

Observableを配置するアイデアは、2つの目的を果たします。
2)リリースリソース -不要なリソースを解放するためのバックグラウンドタスクを停止します。たとえば、ユーザーがアクティビティを終了したときに、リクエスト/処理がもう関連しない可能性があります。

バックグラウンドタスク(ファイルのアップロード)を再開したい場合は、ビュー(2)を避け、そのビュー(1)から切り離してください。

あなたの解決策は、完了時にObservableとしてとなるでしょう。さらに、アップロードの特定の期間を取ることはできません(最大でタイムアウト値です)。

RxJavaとソリューションは、あなたのケースで、 publishshareなどの演算子を使用して Observableがマルチキャストされ

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

この方法で、uploadObservablesubscribe最初に実行が開始されますが、呼び出されたときdispose停止しませんが、むしろ参照の参照を切り離します。


これまで述べてきたように、あなたのアップロードシナリオはAndroidでフォアグランドサービスなしで確実に行うことはできません。

関連する問題