【问题标题】:How to stop an observable upon click in RxAndroid?如何在 RxAndroid 中单击时停止观察?
【发布时间】:2017-05-13 14:43:06
【问题描述】:

我正在学习 RxAndroid/RxBinding。我正在尝试在按钮单击事件时停止可观察的序列,但不知道该怎么做。

FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
Button bt = (Button)findViewById(R.id.button);

RxView.clicks(fab).subscribe(view ->Snackbar.make(SnakebarLayout, "Actions", Snackbar.LENGTH_LONG).setAction("Action", null).show());
RxView.clicks(bt).subscribe(view -> Observable.range(10, 5).subscribe(i-> Toast.makeText(this,i.toString(),Toast.LENGTH_SHORT).show()));

如您所见,我有两个按钮,每个按钮都订阅了一个可观察序列,我想要的是:

(1) 如果我先单击一个按钮,然后再单击另一个按钮,则第一个按钮的可观察操作应立即停止。

(2) 如果我单击一个按钮,然后再次单击它,observable 应该立即重新启动。目前,如果我再次单击它,它将等到当前的 observable 完成然后重新开始。

【问题讨论】:

    标签: android rx-java rx-android rx-java2 rx-binding


    【解决方案1】:

    首先那些代码不太好:

    RxView.clicks(bt).subscribe(view -> Observable.range(10, 5).subscribe(i-> Toast.makeText(this,i.toString(),Toast.LENGTH_SHORT).show()));
    

    改成

    RxView.click(bt)
          .flatMap(ignore -> Observable.range(10,5))
          .subscriber(//your toast)
    

    至于你的问题

    (1) 如果我先单击一个按钮,然后再单击另一个按钮,则第一个按钮的可观察操作应立即停止。

    您的subscribe() 方法将返回一个disposable(),它是一个让您控制流的开关。

    您可以在第二个按钮的subscribe() 内调用disposable.dispose()

    (2) 如果我单击一个按钮,然后再次单击它,observable 应该立即重新启动。目前如果我再次点击它,它会等到当前的 observable 完成然后重新开始。

    这个要求对我来说有点奇怪。所以第一部分你可以使用switchMap 而不是flatMap。第二部分我没听懂。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-29
      • 1970-01-01
      • 2018-04-18
      相关资源
      最近更新 更多