web-dev-qa-db-ja.com

RxJavaでCompletable、Single、Maybeを破棄してObservableを終了するためのベストプラクティス

Androidの観点からこれを求めていますが、これは一般的にRxJavaに適用されるはずです。

ベストプラクティスとして、私の見解では、短命のCompletableSingleMaybeを常に破棄し、Observable Rxタイプを終了する必要がありますshould)短い順序で終了しますが、ユーザーがビューを閉じたときにまだ実行されている可能性がありますか? Rxチェーンが終了すると破棄されることは承知していますが、これはビューが閉じられた後に発生する可能性があります。

たとえば、HTTP GETを実行しているSingle。呼び出しは完了しますが、ビューが破棄された後で、一時的にガベージコレクションが妨げられる場合があります。

そして、CompositeDisposableを使用してそのようなDisposablesを長期間表示する場合、clear()に注意を払うか、そうでなければこれらのDisposablesを定期的に使用して、CompositeDisposableのサイズの無制限の増加を防ぎます。

18
HolySamosa

ベストプラクティスとして、私の見解では、短命のCompletable、Single、Maybe、およびObservable Rxタイプの終了でさえも、常に破棄する必要があります。

コードを他の人と共有している場合、ベストプラクティスとして、はい、廃棄する必要がありますと言います。余分なボイラープレートのように思えるかもしれませんが、次の開発者がサブスクリプションコードにフックして、もう存在しない可能性のあるコンポーネント(Contextの後のFragment _は切り離されます...など)。

また、CompositeDisposableを使用してこのような使い捨て品を長寿命で収集する場合、CompositeDisposableのサイズの無制限の成長を防ぐために、これらの使い捨て品を定期的にclear()または削除するように注意する必要があると思いますか?

Rxjava2では、CompositeDisposablesに状態があることに注意してください。 dispose()を呼び出すと、その後に追加されたDisposableはすぐに破棄されます。ベストプラクティスとして:

  1. ライフサイクルの開始時に新しいCompositeDisposableを作成します(onCreate(...)など)
  2. dispose()onDestroy(...)に注意してください。その時点までに、コールバックには実質的に値がなく、リソースを保持しているだけです。
10
Jon

このような問題を回避するために、CompositeDisposableまたはonPauseonDestroyを配置することをお勧めします。

3
Benjamin