节流方法调用RxJava
我想使用节流方法调用RxJava,java,android,rx-java,accessibilityservice,Java,Android,Rx Java,Accessibilityservice,我想使用RxJava来限制我从android.accessibilityservice.accessibilityservice获得的AccessibilityEvent的数量,特别是 每当用户在EditText小部件中键入任何内容时,它就会被激发。然而,我尝试了使用debounce,throttleLast,throttleFirst甚至缓冲区。但是,如果我还没有想要发出的所有事件,我不确定应该如何确切地使用它们 public class AccessibilityService extend
RxJava
来限制我从android.accessibilityservice.accessibilityservice
获得的AccessibilityEvent
的数量,特别是
每当用户在EditText
小部件中键入任何内容时,它就会被激发。然而,我尝试了使用debounce
,throttleLast
,throttleFirst
甚至缓冲区。但是,如果我还没有想要发出的所有事件,我不确定应该如何确切地使用它们
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
的东西
因此,我的输出可以是:
[这是]
[这是一个]
[这是一个测试]
而不是:
[t]
[th]
[thi]
[本]
提前谢谢 我将执行以下操作:
- 创建设置“可访问性侦听器”的可观察对象
- 此侦听器可以启动RxJava事件流
- 订阅流,并让服务控制器在适当的时间评估事件
重新设计某些东西使其具有反应性的关键是确保代码中的所有内容都成为某种触发器。如果您需要流中的一些逻辑,那么回调就没有多大作用
以下是一个例子:
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);
}
AccessibilityServiceController AccessibilityServiceController;
行动1可访问性EventListener;
可访问性服务(){
accessibilityServiceController=新的accessibilityServiceController();
创建(新的Observable.OnSubscribe(){
@凌驾
公共无效呼叫(最终用户OK)
我发现有一个主题是PublishSubject
/Subject
我基本上可以在创建了一个可观察的后,作为某种设置者发布到onNext,这就是我所追求的
public class AccessibilityService extends android.accessibilityservice.AccessibilityService {
private final PublishSubject<AccessibilityEvent> accessibilityEventPublishSubject = PublishSubject.create();
public AccessibilityServiceControllerImpl() {
accessibilityEventPublishSubject
.debounce(400, TimeUnit.MILLISECONDS)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<AccessibilityEvent>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(AccessibilityEvent accessibilityEvent) {
Log.d(TAG, accessibilityEvent.toString());
}
});
}
@Override
public void evaluateEvent(final AccessibilityEvent accessibilityEvent) {
int type = accessibilityEvent.getEventType();
switch (type) {
case AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED:
Timber.d("Event received in controller: " + accessibilityEvent.toString());
accessibilityEventPublishSubject.onNext(accessibilityEvent);
break;
default:
break;
}
}
}
但我想这值得再问一个问题。什么意思是:“但是,如果我还没有所有要发出的事件,我不确定应该如何确切地使用它们。”?您在创建事件的可观察对象时遇到问题了吗?还是仅仅选择了正确的筛选运算符?我基本上想在创建后将对象添加到onNext中我的Observable。然后应用正确的过滤器来获得我想要的输出。如果我在创建Observable时有事件列表,我可以使用Observable.from()但是我想将事件“推”到我的Observable。那么使用debounce有什么问题?你能发布你的rx相关代码吗?
@Override
public void executeMessage(Message message) {
switch (message.what) {
case DO_ON_ACCESSIBILITY_EVENT: {
AccessibilityEvent event = (AccessibilityEvent) message.obj;
if (event != null) {
AccessibilityInteractionClient.getInstance().onAccessibilityEvent(event);
mCallback.onAccessibilityEvent(event);
try {
//EVENT IS RECYCLED BEFORE THE ONNEXT IS CALLED IN MY PUBLISHSUBJECT
event.recycle();
} catch (IllegalStateException ise) {
}
}
} return;
... bla bla