2017-02-16 6 views
1

Я хочу реализовать простой таймер, который будет подсчитывать значения от 1 до 30 в секунду. Когда он достигнет 30, я хочу, чтобы он остановился. Теперь у меня есть что-то вроде этого, но я не знаю, как остановить его через 30 секунд.Таймер Android с RxJava

Вот код:

Observable<Long> observable = Observable.interval(1, TimeUnit.SECONDS); 

    observable.subscribe(
      new Action1<Long>() { 
       @Override 
       public void call(Long aLong) { 
        Log.d("Observable timer: ", aLong.toString()); 
       } 
      }, 
      new Action1<Throwable>() { 
       @Override 
       public void call(Throwable error) { 
        System.out.println("Error encountered: " + error.getMessage()); 
       } 
      }, 
      new Action0() { 
       @Override 
       public void call() { 
        System.out.println("Sequence complete"); 
       } 
      } 
    ); 

Может кто-то помочь?

ответ

4

Вы хотите сосчитать один раз?

Observable.interval(1, TimeUnit.SECONDS) 
.take(30) // up to 30 items 
.map(v -> v + 1) // shift it to 1 .. 30 
.subscribe(System.out::println); 

Thread.sleep(35000); 

Подсчитайте несколько раз от 1 до 30?

Observable.interval(1, TimeUnit.SECONDS) 
.map(v -> (v % 30) + 1) // shift it to 1 .. 30 
.subscribe(System.out::println); 

Thread.sleep(91000); 
+0

Круто, и как я могу показать это, например, в TextView? – wegtis

+1

@wegtis '.observeOn (AndroidSchedulers.mainThread()). Subscribe (result -> textView.setText (result));' – Dimezis

+0

@Dimezis это бросает что-то вроде «Исключение, брошенное в поток Scheduler.Worker. Добавьте 'onError' обработку '. Как я могу найти решение для этого? – wegtis

0

Вы можете реализовать это следующим образом:

public static final int TIMER_VALUE = 30; 

.... 

Observable.interval(1, TimeUnit.SECONDS) 
      .subscribeOn(Schedulers.io()) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .doOnNext(new Consumer<Long>() { 
       public void accept(Long x) throws Exception { 
        // update your view here 
        myTextView.setText(String.valueOf(x)); 
       } 
      }) 
      .takeUntil(aLong -> aLong == TIMER_VALUE) 
      .doOnComplete(() -> 
        // do whatever you need on complete 
      ).subscribe() 
+0

Оператор subscribeOn не нужен, поскольку по умолчанию выполняется интервал в потоке Schedulers.computation ... –

Смежные вопросы