2016-03-06 41 views
1

我想用RxJava来节流AccessibilityEvent的数量,我从android.accessibilityservice.AccessibilityService特别是TYPE_VIEW_TEXT_CHANGED event得到。油门方法调用RxJava

每当用户键入EditText小部件中的任何内容时,它都会被触发。不过,我尝试使用debounce,throttleLastthrottleFirst或甚至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]

[日]

[THI]

[这]

...

提前感谢!

+0

什么意思:'但是我不确定我应该如何使用它们,如果我还没有发完所有事件的话。 ? 您是否在创建一个从您的事件obetable问题? 或者只是选择正确的过滤器运算符? –

+0

我基本上想在创建我的Observable后将对象添加到我的onNext。然后应用正确的过滤器来获得我想要的输出。如果我在创建可观察事件时将事件列表与事件相关联,那么我可以使用Observable.from(),但是我想将事件“推送”给可观察事件。 – tim

+0

那么使用去抖动有什么问题?你能不能发布你的rx相关代码? –

回答

0

好的。

我发现有东西作为PublishSubject/Subject

我创建Observable之后,我基本上可以将它作为某种设置器发布到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; 
     } 
    } 
} 

这是这个问题的答案。但是我面临的是空物体,因为它们是。

@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 

但我想这在这里值得另一个问题。

1

我会做到以下几点:

  • 创建一个可观察到的这台是“交通方便听众”
  • 此侦听器可以启动事件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); 
} 

你可能不希望把这个东西在构造函数,但你的想法。 Observable构建到收听者中。我还建议保留对Subscription的引用,因为为了防止内存泄漏,取消订阅非常重要!