我想使用 RxJava
来限制从 android.accessibilityservice.AccessibilityService
中获取的 AccessibilityEvent
数量特别是TYPE_VIEW_TEXT_CHANGED event .
每次用户在 EditText
小部件中输入任何内容时,它都会被触发。不过,我尝试使用 debounce
、throttleLast
、throttleFirst
甚至 buffer
。但是,如果我还没有想要发出的所有事件,我不确定应该如何使用它们。
public class AccessibilityService extends android.accessibilityservice.AccessibilityService {
@Inject
AccessibilityServiceController accessibilityServiceController;
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
Timber.d("AccessibilityEvent was received: " + event.toString());
//Throttle so I only get the last event in XXX milliseconds.
accessibilityServiceController.evaluateEvent(event);
}
@Override
public void onInterrupt() {
Timber.e("Service was interrupted! ");
}
}
我想要在此 EditText
小部件上使用类似于 debounce
的东西
Kaushik Gopal's DebounceSearchEmitterFragment.java
所以我的输出可以是:
[这是]
[这是一个]
[这是一个测试]
而不是:
[t]
[第]
[三]
[此]
...
提前致谢!
最佳答案
我会执行以下操作:
- 创建一个设置“可访问性监听器”的可观察对象
- 此监听器可以启动 RxJava 事件流
- 订阅流,并让服务 Controller 在适当的时间评估事件
重新设计某些东西以使其具有反应性的关键是确保代码中的所有内容都成为某种触发器。如果您需要流中的一些逻辑,则回调不会做太多事情。
下面是一个例子:
AccessibilityServiceController accessibilityServiceController;
Action1<AccessibilityEvent> accessibilityEventListener;
AccessibilityService() {
accessibilityServiceController = new AccessibilityServiceController();
Observable.create(new Observable.OnSubscribe<AccessibilityEvent>() {
@Override
public void call(final Subscriber<? super AccessibilityEvent> subscriber) {
accessibilityEventListener = new Action1<AccessibilityEvent>() {
@Override
public void call(AccessibilityEvent accessibilityEvent) {
subscriber.onNext(accessibilityEvent);
}
};
}
})
.debounce(500, TimeUnit.MILLISECONDS) // <-----
.subscribe(new Action1<AccessibilityEvent>() {
@Override
public void call(AccessibilityEvent accessibilityEvent) {
accessibilityServiceController.evaluateEvent(accessibilityEvent);
}
});
}
private void setAccessibilityEventListener(Action1<AccessibilityEvent> listener) {
accessibilityEventListener = listener;
}
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
// This will be throttled every 500 Milliseconds
accessibilityEventListener.call(event);
}
您可能不想将这些东西放入构造函数中,但您明白了。 将Observable
构建到监听器中。我还建议保留对订阅
的引用,因为取消订阅对于防止内存泄漏非常重要!
关于java - 调用 RxJava 的 Throttle 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35833356/