在不影响 Android 中的 UI 的情况下,在 RecyclerView 中设置倒数计时器的最佳方法是什么?
What is the best way to set a count down timer inside RecyclerView without affecting UI in Android?
我想在 recyclerview 的每个事件中设置一个倒数计时器。
我在onBindViewHolder里面试过了。它正在工作,但同时它也在影响 UI。
例如,点击事件不起作用。
有没有最好的解决方法?
您可以使用 RxJava
中的 Observable.interval
这是 countdowntimer
的实用函数
public static Observable<Long> countdownTimer(long countdownValue, Observer<Long> observer) {
if (observer == null) return Observable.just((long) 0);
//.interval is a cold observable
// it will emit separately for every observer
Observable<Long> timerObservale = Observable
.interval(1, TimeUnit.SECONDS)
.subscribeOn(Schedulers.io())
.takeWhile(new Predicate<Long>() {
@Override
public boolean test(Long aLong) throws Exception {
return aLong <= countdownValue;
}
})
.doOnError(Throwable::printStackTrace)
.observeOn(AndroidSchedulers.mainThread());
timerObservale.subscribe(observer);
return timerObservale;
}
以下是您将如何使用它
Utils.countdownTimer(60, new Observer<Long>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(Long aLong) {
//do somethng
}
@Override
public void onError(Throwable e) {
e.printStackTrace();
}
@Override
public void onComplete() {
}
});
utils 函数在给定的时间段内每秒发出一个 long
我想在 recyclerview 的每个事件中设置一个倒数计时器。
我在onBindViewHolder里面试过了。它正在工作,但同时它也在影响 UI。
例如,点击事件不起作用。
有没有最好的解决方法?
您可以使用 RxJava
中的 Observable.interval
这是 countdowntimer
public static Observable<Long> countdownTimer(long countdownValue, Observer<Long> observer) {
if (observer == null) return Observable.just((long) 0);
//.interval is a cold observable
// it will emit separately for every observer
Observable<Long> timerObservale = Observable
.interval(1, TimeUnit.SECONDS)
.subscribeOn(Schedulers.io())
.takeWhile(new Predicate<Long>() {
@Override
public boolean test(Long aLong) throws Exception {
return aLong <= countdownValue;
}
})
.doOnError(Throwable::printStackTrace)
.observeOn(AndroidSchedulers.mainThread());
timerObservale.subscribe(observer);
return timerObservale;
}
以下是您将如何使用它
Utils.countdownTimer(60, new Observer<Long>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(Long aLong) {
//do somethng
}
@Override
public void onError(Throwable e) {
e.printStackTrace();
}
@Override
public void onComplete() {
}
});
utils 函数在给定的时间段内每秒发出一个 long