0

我正在学习 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 完成然后重新开始。

4

1 回答 1

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(),它是一个让你控制流的开关。

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

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

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

于 2017-05-16T08:33:11.223 回答