我正在尝试熟悉RxJava。这是我想要实现的用例:
我的屏幕上有一个按钮,我想收集点击次数。因此,如果用户点击按钮,则会注册单击并生成日志。现在,如果用户连续点击两次该按钮,则会注册两个点击事件,将其收集起来,并输出2而不是1。
基本上,我正在尝试在一段时间内累积点击次数,然后输出最终结果。我猜测 "buffer" 是我需要使用的方法。我在Android中快速编写了一个示例(代码如下),但是 buffer 方法似乎并不像只是收集所有事件输入并输出一个集合那么简单。
我的屏幕上有一个按钮,我想收集点击次数。因此,如果用户点击按钮,则会注册单击并生成日志。现在,如果用户连续点击两次该按钮,则会注册两个点击事件,将其收集起来,并输出2而不是1。
基本上,我正在尝试在一段时间内累积点击次数,然后输出最终结果。我猜测 "buffer" 是我需要使用的方法。我在Android中快速编写了一个示例(代码如下),但是 buffer 方法似乎并不像只是收集所有事件输入并输出一个集合那么简单。
public class DemoFragment
extends Fragment {
private int _tapCount = 0;
private Observable<List<Integer>> _bufferedObservable;
private Observer<List<Integer>> _observer;
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
_setupLogger();
_bufferedObservable = _getBufferedObservable();
_observer = _getObserver();
}
// the library butterknife allows this
@OnClick(R.id.btn_start_operation)
public void onButtonTapped() {
_log("GOT A TAP");
_bufferedObservable.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(_observer);
}
private Observable<List<Integer>> _getBufferedObservable() {
return Observable.create(new Observable.OnSubscribe<Integer>() {
@Override
public void call(Subscriber<? super Integer> subscriber) {
subscriber.onNext(1); // send one tap here
}
}).buffer(2, TimeUnit.SECONDS); // collect all taps in the last 2s
}
private Observer<List<Integer>> _getObserver() {
return new Observer<List<Integer>>() {
@Override
public void onCompleted() {
_log(String.format("%d taps", _tapCount));
_tapCount = 0; // reset tap count
}
@Override
public void onError(Throwable e) {}
@Override
public void onNext(List<Integer> integers) {
if (integers.size() > 0) {
for (int i : integers) {
_tapCount += i;
}
onCompleted();
} else {
_log("No taps received");
}
}
};
}
// ... other method that help wiring up the example (irrelevant to RxJava)
}
有人能帮助我理解我这里的误解吗?
问题1:我期望_getObserver()
的onNext
向我发送一个包含累计点击次数的列表。因此,如果按钮被点击了5次,则我期望一个列表,其中有5个项目,每个项目的值为“1”。但是现有代码中,我总是得到一个空列表。
问题2:如果List<Integer> integers
大小不为空,我会在控制台记录日志,说“未收到敲击”。似乎Observable永远不会停止。就像一个计时器一样,即使没有注册按钮点击,它也会不断地继续下去。是否有方法在最后10秒内没有注册事件时停止Observable?
问题3:发射的数量似乎呈几乎指数增长。就像它从所有以前的时间收集空按钮敲击一样。