【问题标题】:How to throttle/debounce seekbar seek events in MediaPlayer app如何在 MediaPlayer 应用程序中限制/去抖动搜索栏搜索事件
【发布时间】:2016-02-20 12:14:39
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:
    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);
                    }
                });
    

    在这种情况下,我使用 debounce 并且不限制。我发现以下类比很有帮助:

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

    效果将是,如果用户在搜索栏上快速移动手指,则只有最后一个事件会“获胜”并触发 MediaPlayer 实例上的搜索操作:您不会听到“刮擦噪音”或浪费性能。

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

    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
                    }
                });
    

    【讨论】:

    • 您能否澄清一下“mUpdateProgressRoutine.stopRoutine();”是什么意思?意思是?还有为什么方法“onBackpressureLatest()”还没有为我解决?我使用 rxjava2。
    • 对于 rxjava2:RxSeekBar.userChanges(mSeekBar).toFlowable(BackpressureStrategy.LATEST) 似乎是正确的方法。
    • 感谢您指出 Rxjava 中的“.ofType”过滤器。我需要知道更改是否来自用户,您可以节省我的时间。
    【解决方案2】:

    虽然与问题没有直接关系,但是,如果有人想知道如何订阅 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 : " );
                    }
                });
    

    【讨论】:

    • 这就是答案。谢谢
    猜你喜欢
    • 2020-03-19
    • 2021-08-16
    • 1970-01-01
    • 2018-05-15
    • 1970-01-01
    • 2019-03-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    相关资源
    最近更新 更多