0

Я начал изучать RxJava и RxAndroid. Я хотел бы заменить шаблон наблюдателя на RxJava. Шаблон наблюдателя похож на класс Android LocationManager, который имеет методы регистрации и отмены регистрации. «Наблюдаемый» класс (не означает rx.Observable) работает в своем потоке (HandlerThread) и владеет картой слушателя и его объектом Handler, и каждый из слушателей вызывается в его потоке (через Handler). Понятно, я думаю. Итак, вопрос в том, как реализовать его с помощью RxJava? Имеет ли это смысл? Я читал о PublishSubject и Subscriber, но я не знаю, как запустить мой Observable в его потоке. Я не хочу использовать метод subscribeOn, потому что Subscriber не создает Observable, а только подписывается на получение уведомлений в своем потоке. Спасибо за любые предложения.Замените шаблон наблюдателя на RxJava на Android

+0

Привет, RxJava реализует шаблон наблюдателя для вас. Вы просто создаете потоки данных, а затем подписываетесь. Вы можете создавать разные наблюдатели через операторов. RxJava не сулит о потоковом использовании. Фактически RxJava по умолчанию имеет однопоточность. Пожалуйста, взгляните на эту книгу «Реактивное программирование с помощью RxJava» (http://shop.oreilly.com/product/0636920042228.do). Он проведет вас через все проявления RxJava с примерами Android. –

ответ

1

Ваш общий подход является хорошим. Позвольте мне изложить несколько аспектов для вас.

Предположим, что ваш наблюдаемый класс несет ответственность за значение, которое изменяется с течением времени. Раньше вы регистрировали бы наблюдателя, и наблюдаемый объект предупреждал бы каждого наблюдателя, когда его значение изменилось. Предположим, вы наблюдаете изменения цвета. (Внимание:. Непроверенный код следующим образом я использовал подобный код для адаптации шаблона Observer в RxJava.)

PublishSubject<Color> ps1 = new PublishSubject<>(); // your observable class 
Observable<Color> observable = ps1.observeOn(Schedulers.newThread()); 
... 
// handler in another thread 
Subscription sub = observable.subscribeOn(myThreadScheduler).subscribe(myHandler); 

Теперь ваш обработчик будет вызван на резьбе указанного myThreadScheduler. Вы также можете отменить свои наблюдения на sub.unsubscribe().

+0

Хорошо, но как насчет нескольких наблюдателей? My Observable - одноэлементный, так что есть только один рабочий поток. Я полагаю, что наблюдатели не должны вызывать метод subscribeOn. Я прав? – piotrek00

+0

Каждый наблюдатель выполнит эту последнюю строку. Что 'subscribeOn()' does выполняет передачу данных между потоками. –

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