簡體   English   中英

如何阻止 rx-java runnable 發射?

[英]How can I stop rx-java runnable from emitting?

我有以下可觀察的:

      ScheduledExecutorService executorService = Executors.newScheduledThreadPool( 1 );
      Observable<List<Widget>> findWidgetsObservable = Observable.create( emitter -> {
         executorService.scheduleWithFixedDelay( emitFindWidgets( emitter, 0, 30, TimeUnit.SECONDS );
      } );

     private Runnable emitFindWidgets( ObservableEmitter<List<Widgets>> emitter ) {
        return () -> {
              emitter.onNext( Collections.emptyList() ); // dummy empty array
        };
     }

我在 graphql-java 訂閱解析器中返回它,如下所示:

      ConnectableObservable<List<Widget>> connectableObservable = findWidgetsObservable.share().publish();
      Disposable connectionDisposable = connectableObservable.connect();
      return connectableObservable.toFlowable( BackpressureStrategy.LATEST )

graphql 訂閱按預期工作,並將數據發送到 JavaScript graphql 客戶端,但是當客戶端取消訂閱時,我的 Runnable 似乎無限地繼續。 也就是說,flowable 的 doOnCancel() 事件處理程序正在運行。

為了解決這個問題,我嘗試在 flowable 的 doOnCancel() 中執行以下操作:

    Disposable connectionDisposable = connectableObservable.connect();
    return connectableObservable.toFlowable( BackpressureStrategy.LATEST ).doOnCancel( () -> {
             findWidgetsObservable.toFuture().cancel( true );
             connectionDisposable.dispose();
    })

但是,Runnable 繼續無限期地省略。 有什么辦法可以解決這個問題並完全停止排放?

我確實有一個想法:scheduleWithFixedDelay 返回一個 ScheduledFuture,它有一個 cancel() 方法,但我不確定當調度本身在 observable 范圍內時我能做到這一點。 任何幫助表示贊賞。

可運行對象繼續發射,因為您在一個未知/綁定到可觀察 stream 的調度程序上調度發射。

當您處理連接時,您將停止從上游接收項目,因為與上游可觀察對象的連接被切斷。 但是由於您正在調度發射器以在單獨的調度程序上重復運行,因此可運行對象會繼續運行。

您可以使用自定義調度程序描述自定義調度行為並將其傳遞給subscribeOn(Your-Custom-Scheduler)

此外,您提到您可以在doOnDispose()ScheduledFuture上調用cancel() ) 。

但是您應該在可觀察鏈中顯式切換調度程序。 否則,調試會變得更加困難。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM