- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在编写一个 MediaPlayer Android 应用程序并希望限制/消除 Seekbar 事件。无法找到一个好的解决方案来最小化用户在搜索栏上移动手指时生成的搜索操作的数量。
在不使用额外库的情况下,最简单的解决方案是什么?
我将发布涉及 RxJava 和 RxBindings 的解决方案作为帮助他人的答案。
最佳答案
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);
}
});
在这种情况下,我使用去抖并且不节流。我发现以下类比很有帮助:
Imagine that you go home, enter in the elevator, doors are closing... and suddenly your neighbor appears in the hall and tries to jump on the elevator. Be polite! and open the doors for him: you are debouncing the elevator departure. Consider that the same situation can happen again with a third person, and so on... 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
}
});
关于android - 如何在 MediaPlayer 应用程序中限制/去抖搜索栏搜索事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35523107/
我是一名优秀的程序员,十分优秀!