如何在RxAndroid中单击时停止观察?

时间:2017-05-13 14:43:07

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

我正在学习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应立即重启。目前,如果我再次点击它,它将等到当前可观察完成然后再次开始。

1 个答案:

答案 0 :(得分:0)

首先这些代码不太好:

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.dispose()内拨打subscribe()

  

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

这个请求对我来说有点离奇。因此,第一部分您可以使用switchMap代替flatMap。第二部分我不太明白。