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

时间:2016-02-20 12:14:40

标签: android android-mediaplayer rx-java reactive-programming rx-android

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

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

我会发布我的解决方案,其中涉及RxJava& RxBindings作为帮助他人的答案。

2 个答案:

答案 0 :(得分: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);
                }
            });

在这种情况下,我使用去抖动而不是节流。我发现以下类比很有帮助:

  

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

效果将是如果用户在搜索栏上快速移动手指,则只有最后一个事件才会赢得&#34;并在MediaPlayer实例上触发搜索操作:您不会听到&#34;刮擦噪音&#34;或浪费表现。

由于我还没有找到关于如何在不使用两个不同的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
                }
            });

答案 1 :(得分:1)

尽管与该问题没有直接关系,但是,如果有人想知道如何订阅RxSeekBar的所有三个事件,那么您可以:

科特琳:

        RxSeekBar.changeEvents(seekbar)
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe { seekBarChangeEvent ->
                when (seekBarChangeEvent) {
                    is SeekBarProgressChangeEvent -> Log.d(TAG, "on Progress : " + seekBarChangeEvent.progress())
                    is SeekBarStartChangeEvent -> Log.d(TAG, "on Start : ")
                    is SeekBarStopChangeEvent -> Log.d(TAG, "on Stop : ")
                }
            }

Java:

    RxSeekBar.changeEvents(seekbar)
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(seekBarChangeEvent -> {
                if (seekBarChangeEvent instanceof SeekBarProgressChangeEvent)
                {
                    SeekBarProgressChangeEvent seekBarProgressChangeEvent = (SeekBarProgressChangeEvent) seekBarChangeEvent;
                    Log.d(TAG, "on Progress : " + seekBarProgressChangeEvent.progress());
                }
                else if (seekBarChangeEvent instanceof SeekBarStartChangeEvent)
                {
                    Log.d(TAG, "on Start : " );
                }
                if (seekBarChangeEvent instanceof SeekBarStopChangeEvent)
                {
                    Log.d(TAG, "on Stop : " );
                }
            });