2016-01-29 3 views
0

У меня есть следующий тестовый случайПримите и использование дребезга вопрос

public void testLimitAndPublishSubject() throws InterruptedException { 
    PublishSubject<Boolean> mBooleanPublishSubject = PublishSubject.create(); 
    mBooleanPublishSubject.asObservable() 
      .doOnEach(__ -> System.out.println("on value emitted "+System.currentTimeMillis())) 
      .take(1) 
      .doOnEach(__ -> System.out.println("on value emitted 2 "+System.currentTimeMillis())) 
      .debounce(1000, TimeUnit.MILLISECONDS) 
      .doOnEach(__ -> System.out.println("on value emitted 3 "+System.currentTimeMillis())) 
      .subscribe(__ -> System.out.println("done "+System.currentTimeMillis())); 
    mBooleanPublishSubject.onNext(true); 
    Thread.sleep(1000); 
    mBooleanPublishSubject.onNext(true); 
    Thread.sleep(2000); 
} 

и выход

on value emitted 1454063289770 
on value emitted 2 1454063289770 
on value emitted 2 1454063289779 
on value emitted 3 1454063289780 
done 1454063289780 
on value emitted 3 1454063289780 

Я не могу понять, почему on value emitted 2 и on value emitted 3 появляется в журнале дважды, и почему задержка debounce не работает. Может ли кто-нибудь помочь?

ответ

0

Обсуждаемые here

Для устранения повторяющихся элементов в выпуске журнала я должен использовать doOnNext вместо doOnEach, таких как doOnEach включает onCompleted события

take(1) Завершает наблюдаемым сразу, поэтому дребезг не работает. Следует использовать задержку вместо

mBooleanPublishSubject.asObservable() 
     .doOnNext(__ -> System.out.println("on value emitted " + System.currentTimeMillis())) 
     .take(1) 
     .doOnNext(__ -> System.out.println("on value emitted 2 " + System.currentTimeMillis())) 
     .delay(1, TimeUnit.SECONDS) 
     .doOnNext(__ -> System.out.println("on value emitted 3 " + System.currentTimeMillis())) 
     .subscribe(__ -> System.out.println("done " + System.currentTimeMillis())); 
Смежные вопросы