java - 调用 RxJava 的 Throttle 方法

标签 java android rx-java accessibilityservice

我想使用 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 的 Throttle 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35833356/

相关文章:

java - android/graphics/bitmapfactory 上的 NoClassDefFoundError

java - 获取 Observable 的最新值并立即发出

java - 如何处理 RxJava 中观察者的 onNext 抛出的异常?

java - 在 MAP 中使用 Pojo 作为 key 无法找到 key Java 8

java - Android Studio 出于某种原因无法识别实验室助手类?

java - 如何从另一个线程启动一个线程并在执行后重新启动一个线程?

Android 转换程序在单击按钮时崩溃

java - 如何将 Observable<String> 转换为 JSON

java - 关于改进素数代码的建议?

Java动态绑定(bind)和方法重写过程