2017-06-30 10 views
0

ObservableオブジェクトがGCによってgarbagedされていない場合に使用すると、Observableオブジェクトを解放/解放する必要がありますか?私はそれを言及するための記事を見つけることはなかった。 ObservableオブジェクトはGCによって自動的にガベージされますか?Observableオブジェクトを使用した後に解放/解放する必要がありますか?

Observable.create(new ObservableOnSubscribe<Boolean>() { 
     @Override 
     public void subscribe(ObservableEmitter<Boolean> e) throws Exception { 
      boolean connected = true; 
      //my logic code here 
      e.onNext(connected); 
      e.onComplete(); 
      e.setCancellable(null); 
      //Do I need to do some extra release/free Observable object work in case Observable object is not garbaged by GC? 
     } 
    }).subscribeOn(Scheduler.ioThread()) 
      .observeOn(Scheduler.mainThread()) 
      .subscribe(new Consumer<Boolean>() { 
       @Override 
       public void accept(Boolean connected) throws Exception { 
        //my logic code here. 
        //Do I need to do some extra release/free Observable object work in case Observable object is not garbaged by GC? 
       } 
      }, new Consumer<Throwable>() { 
       @Override 
       public void accept(Throwable throwable) throws Exception { 
        //my logic code here. 
        //Do I need to do some extra release/free Observable object work in case Observable object is not garbaged by GC? 
       } 
      }); 

答えて

1

ほとんどの場合、早期にキャンセルしたい場合や、Observableの購読期間より長い場合は、明示的にunsubscribeメソッドを呼び出す必要はありません。 Observable演算子のデフォルトの動作は、.complete()または.error()メッセージが発行されるとすぐにサブスクリプションを破棄することです。 RxJSは、ほとんどの場合、「消火忘却」方式で使用するように設計されていたことに留意してください。 read

1

Observableは自動的に「自由」何もしませんが、あなたはそれを行うためのツールを提供します。
は、いくつかの観察可能と資源管理の側面があります:「プロデューサー」に関連するすべてのリソースの解放

  • - イベントを生成したリソースを、このリソースは、IO関連のリソースから何もすることができます - ネットワーククエリ、一部のハードウェア/センサー関連イベント、DBトリガー、 UI関連リソース - クリック、スクロールなど
    が提供するフレームワークで管理する必要があるのは、Cancellable/Disposableのコンポーネントです。このフレームワークは、Observableが完了したときにこのイベントがトリガされることを保証します。退会/処分の場合Observable。あなたのプロデューサーロジックに依存します。
  • を明示的にObesrvableから削除/解約することは、適切なロジックをトリガーすることです。リソースはもはや必要ありません。Observableはリソースをクリアするためのフレームワークを提供しますが、明示的にトリガーするのはあなた次第です。 ObservableはObservableが完了したとき自動的にトリガしますが、あまりにも遅く、その前にキャンセルしたい場合(ネットワーククエリ)、Observableが無限のアイテムである場合、DB挿入リスナを考えたり、イベントやその他のリスナーをクリックするこの場合、リソースは、Observableを廃棄して明示的に解放するまで保持されます。
  • Subscriberがラッピングクラスへのハードリファレンスを保持し、Observableによってリークされる可能性があるため、メモリリークを防ぐためにObservableSubscriberの間の接続を解く(廃棄する)ことも重要です。 Observableを破棄すると、Producerのサブスクリプションスレッドにスレッド割り込みが発生することに注意する価値があります(UIコンポーネントの古典、サブスクライバはいくつかのUIクラスを参照し、いくつかの静的性質をサブスクライブします)
  • IO操作がある場合は、InterruptedExceptionが発生する可能性があります。
関連する問題