2014-10-04 4 views
2

На Android я написал Observable, который должен вызываться один раз после 2000 мс, но который никогда не вызывается.Почему мой таймер Наблюдаемый никогда не звонил?

Observable.timer(2000, TimeUnit.MILLISECONDS) // wait 2000 msec 
      .subscribeOn(Schedulers.newThread()).observeOn(AndroidSchedulers.mainThread()) 
      .flatMap(new Func1<Long, Observable<?>>() { 

     @Override public Observable<?> call(Long aLong) { 
      continuePlayback(); // this line is never called 
      return null; 
     } 

    }); 

Я хочу Observable ждать от основного потока, а затем вызвать continuePlayback() в главном потоке. Контекстная справка позволила мне разместить subscribeOn/observeOn между timer и flatMap. Это верно? Что на самом деле происходит здесь и что я сделал не так?

Что происходит с Observable после звонка? Будет ли он оставаться в живых или мне нужно будет явно его оторвать, например? позвоните по телефону OnCompleted()?

ответ

3

Большинство Obsersables являются пассивными по умолчанию, и они будут выдавать только элементы, если они подписаны. В вашем примере кода вы не подписываетесь на свой Observable. Поэтому он никогда не начинает испускать элементы или в этом случае единственные элементы после 2000 миллисекунд.

flatMap - это просто Operator, чтобы помочь управлять потоком данных, но он не подписался на ваш поток Observables.

Вместо того, чтобы использовать flatMap, вы должны заменить его на звонок subscribe.

Observable.timer(2000, TimeUnit.MILLISECONDS) 
    .subscribeOn(Schedulers.newThread()) 
    .observeOn(AndroidSchedulers.mainThread()) 
    .subscribe(new Action1<Long>() { 
     @Override 
     public void call(Long aLong) { 
      continuePlayback(); 
     } 
    }); 

Я использовал Action вместо Observer в subscribe, так как я не верю, что вам нужно обрабатывать onError в данном конкретном случае.

Observable от timer завершено после выпуска только товар.

Имейте в виду, что если вы используете Observables изнутри Fragment или Activity вы всегда должны убедиться, что вы unsubscribe от вашего Observables устранить вероятность утечки памяти.

Вот быстрая ссылка на Hot and Cold Observables in RxJava

+0

Это отлично работает, но он поднял вопрос, как бы вы написать Наблюдаемые то излучающие без каких-либо абонентов прикрепленных. Что изменится, если я захочу регулярно испускать? Просто используйте interval() вместо timer()? Кто скажет мне, начнет ли Observable немедленно выдавать или только когда подписчик подписывается? –

+0

«Предметы» являются примером Hot 'Observable'. Их не нужно подписывать, чтобы их вызывал 'onNext'. Я бы предложил прочитать этот http://www.introtorx.com/content/v1.0.10621.0/14_HotAndColdObservables.html. Он был написан с .NET, но по-прежнему применяется к RxJava. –

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