0

我正在尝试编写一个可在用户按住视图时生成重复事件的可观察对象。我下面的代码运行良好,但只是第一次(例如,如果用户再次按下按钮,没有任何反应)。你能告诉我我做错了什么,最好的做法是什么?

val touches = RxView.touches(previousButton)
touches
        .filter({ event -> event.action == MotionEvent.ACTION_DOWN })
        .flatMap({
            Observable.interval(500, 50, TimeUnit.MILLISECONDS)
                    .takeUntil(touches.filter({event -> event.action == MotionEvent.ACTION_UP}))
        }).subscribe({ println("down") })
4

1 回答 1

0

问题是RxView.touchesobservable 不能存在超过 1 个源。这意味着当flatMap发生内的订阅时,它会破坏用于触发的原始​​订阅flatMap,使其不再发生。

有两种可能的解决方法:

  1. 用于.publish(...)共享事件源而不是使用touches.
  2. 将事件映射到Booleanon/off observable,然后switchMap根据 observable 的当前值执行适当的操作。

1.

touches.publish { src ->
    src.filter(...)
       .flatMap {
           Observable.interval(...)
                     .takeUntil(src.filter(...))
       }
}

2.

touches.filter {
           it.action == MotionEvent.ACTION_DOWN 
                or it.action == MotionEvent.ACTION_UP
       }
       .map { it.action == MotionEvent.ACTION_DOWN }
       .distinctUntilChanged() // Avoid repeating events
       .switchMap { state ->
           if (state) {
               Observable.interval(...)
           } else {
               Observable.never()
           }
       }
于 2017-11-18T15:13:19.087 回答