Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
节流方法调用RxJava_Java_Android_Rx Java_Accessibilityservice - Fatal编程技术网

节流方法调用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