Android 如何在MediaPlayer应用程序中调节/消除seekbar seek事件

Android 如何在MediaPlayer应用程序中调节/消除seekbar seek事件,android,android-mediaplayer,rx-java,reactive-programming,rx-android,Android,Android Mediaplayer,Rx Java,Reactive Programming,Rx Android,我正在编写一个MediaPlayer Android应用程序,并希望控制/消除Seekbar事件。无法找到一个很好的解决方案来最小化用户在搜索栏上移动手指时生成的搜索操作数 在不使用其他库的情况下,最简单的解决方案是什么 我将发布我的解决方案,其中包括RxJava和RxBindings作为帮助他人的答案。int SEEKBAR\u THROTTLE\u INTERVAL=100//太太 int SEEKBAR_THROTTLE_INTERVAL = 100; //ms mSeekBarS

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

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

我将发布我的解决方案,其中包括RxJava和RxBindings作为帮助他人的答案。

int SEEKBAR\u THROTTLE\u INTERVAL=100//太太
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);
                }
            });
mSeekBarSubscription=RxSeekBar.userChanges(mSeekBar) .doOnNext(新行动1){ @凌驾 公共无效调用(整数){ mUpdateProgressRoutine.stopRoutine(); } }) .debounce(见kbar\u油门间隔,时间单位为毫秒) .onBackpressureLatest() .observeOn(AndroidSchedulers.mainThread()) .订阅(新操作1(){ @凌驾 公共作废调用(整数进度){ onProgressChanged(mSeekBar,progress,true); } });
在这种情况下,我使用去盎司,不节流。我发现以下类比很有帮助:

想象你回家,进入电梯,门都关上了。。。突然,你的邻居出现在大厅里,试图跳上电梯。要有礼貌!为他开门:你是在解除电梯起飞的警报。考虑到同样的情况会再次发生在第三个人身上,等等…

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

因为我也找不到一个不使用两个不同观测值就订阅所有变更事件的示例,所以我将与大家分享一个示例:

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
                }
            });
mSeekbarSubscription=RxSeekBar.changeEvents(mSeekBar)
.of类型(参见kbarprogresschangevent.class)
.observeOn(AndroidSchedulers.mainThread())
.订阅(新操作1(){
@凌驾
公共作废调用(SeekBarProgressChangeEvent seekBarChangeEvent){
SeekBar SeekBar=seekbarchanegevent.view();
int progress=seekbarchanegevent.progress();
布尔值fromUser=seeKBarchaneEvent.fromUser();
//与SeekbarListener.onProgressChanged相同
}
});

尽管与这个问题没有直接关系,但如果有人想知道如何订阅RxSeekBar的所有三个活动,那你就来吧:

Kotlin:

        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 : ")
                }
            }
    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 : " );
                }
            });
Java:

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

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