gpt4 book ai didi

java - 节流方法调用 RxJava

转载 作者:行者123 更新时间:2023-11-30 10:48:21 24 4
gpt4 key购买 nike

我想使用 RxJava 来限制我从 android.accessibilityservice.AccessibilityService 获取的 AccessibilityEvent 的数量特别是 TYPE_VIEW_TEXT_CHANGED event .

每当用户在 EditText 小部件中键入任何内容时,它都会被触发。但是我尝试使用 debouncethrottleLastthrottleFirst 甚至 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,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35833356/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com