Каков наилучший способ установить таймер обратного отсчета внутри RecyclerView, не влияя на пользовательский интерфейс в Android? - PullRequest
1 голос
/ 08 января 2020

Я хочу установить таймер обратного отсчета внутри каждого события в обзоре переработчика.

Я попробовал это сделать внутри onBindViewHolder. Это работает, но в то же время это также влияет на пользовательский интерфейс.

Например, события щелчка не работают.

Есть ли лучший способ решить эту проблему?

1 Ответ

2 голосов
/ 08 января 2020

Вы можете использовать Observable.interval из RxJava Вот функция утилит для 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() {

            }
        });

Функция утилит выдает длинные каждые секунда за данный период времени

...