如何在MediaPlayer应用中限制/去抖搜索栏搜索事件

Phi*_*ipp 3 android reactive-programming android-mediaplayer rx-java rx-android

我正在编写一个MediaPlayer Android应用程序,并希望限制/去抖Seekbar事件.无法找到一个好的解决方案来最小化用户在搜索栏上移动手指时生成的搜索操作的数量.

在不使用其他库的情况下,最简单的解决方案是什么?

我将发布我的解决方案,其中涉及RxJava和RxBindings作为帮助其他人的答案.

Phi*_*ipp 6

int SEEKBAR_THROTTLE_INTERVAL = 100; //ms
    mSeekBarSubscription = RxSeekBar.userChanges(mSeekBar)
            .doOnNext(new Action1<Integer>() {
                @Override
                public void call(Integer integer) {
                  mUpdateProgressRoutine.stopRoutine();
                }
            })
            .debounce(SEEKBAR_THROTTLE_INTERVAL, TimeUnit.MILLISECONDS)
            .onBackpressureLatest()
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Action1<Integer>() {
                @Override
                public void call(Integer progress) {
                    onProgressChanged(mSeekBar, progress, true);
                }
            });
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我使用去抖动,不要油门.我发现以下类比有用:

想象一下,你回家,进入电梯,门正在关闭......突然你的邻居出现在大厅里,试图跳上电梯.讲礼貌!并为他打开门:你正在解除电梯的离开.考虑到同样的情况可能会再次发生在第三人身上,依此类推...... 来源

结果是,如果用户快速地将手指移动到搜索栏上,则只有最后一个事件将"赢"并触发MediaPlayer实例上的搜索操作:您将听不到"刮擦噪声"或浪费性能.

由于我也找不到一个关于如何在不使用两个不同的Observable的情况下订阅ALL更改事件的示例,我将共享一个示例:

mSeekbarSubscription = RxSeekBar.changeEvents(mSeekBar)
            .ofType(SeekBarProgressChangeEvent.class)
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Action1<SeekBarProgressChangeEvent>() {
                @Override
                public void call(SeekBarProgressChangeEvent seekBarChangeEvent) {
                    SeekBar seekBar = seekBarChangeEvent.view();
                    int progress = seekBarChangeEvent.progress();
                    boolean fromUser = seekBarChangeEvent.fromUser();
                    //same as SeekbarListener.onProgressChanged
                }
            });
Run Code Online (Sandbox Code Playgroud)