Механизм передачи данных из одного обратного вызова в другой - PullRequest
0 голосов
/ 25 февраля 2019

Я хочу использовать «Речь к тексту» в моем приложении для таких действий, как нажатие кнопки «да» или «нет».Я реализовал речь в текст в своем приложении.

В этом у меня есть метод обратного вызова с именем

   public void onResults(Bundle bundle) {

   //here I am getting Yes or No commands via User's Speech
   //bundle object has the data yes/no

   }

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

Для этого учтите, что у меня есть следующие методы:

music.play()
music.pause()
flashlight.on()
flashlight.off()

У меня вопрос, как я могу создать такоймеханизм, с помощью которого я использую Speech для вывода текстовых данных обратного вызова и передачи их другим задачам, выполняющимся в отдельных потоках, и вызова music.play() или flashlight.on()

Я пытался использовать для этого обработчики с sendmessage() иhandlemessage() методы.Но я не могу понять, как я могу реализовать это, когда основной поток не вовлечен.Потому что мои другие задачи находятся в отдельных потоках.

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

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

Bus-Message (ориентированный на события) способ может соответствовать вашей проблеме.Например, у нас есть SomeEventHappenedMessage класс с некоторыми данными внутри.Когда происходит какое-либо событие, сообщение отправляется через шину, и слушатели получают его.

Вы можете написать собственную шину или использовать библиотеку EventBus https://github.com/greenrobot/EventBus для отправки и получения сообщений / событий.

Псевдокод:

//listener registers/unregisters when needed
Bus.register()
Bus.unregister()

//listener listens for message
onMessage(SomeEventHappenedMessage msg) {
    if msg.hasSomeData {
         music.play()
    } else {
         music.stop()
    }
}

//message being sent
SomeEventHappenedMessage message = (message creation)
Bus.sendMessage(message)
0 голосов
/ 25 февраля 2019

Для такого рода логики обратного вызова, которая требует перекрестного взаимодействия с различными задачами и потоками, я обычно использую Reactive Extensions для Android (RxAndroid), в частности Observables.

https://github.com/ReactiveX/RxAndroid

Вы можетесоздавать и просматривать Observables в разных потоках, в основном подписываясь на просмотр переменной, а затем, когда значение изменяется, логика вашего приложения может реагировать на изменение.

Подробнее о многопоточности и RxJava читайте здесь:

https://blog.gojekengineering.com/multi-threading-like-a-boss-in-android-with-rxjava-2-b8b7cf6eb5e2

В зависимости от архитектуры вашего приложения хорошим способом для этого является наличие центрального диспетчера данных приложения, к которому могут обращаться другие компоненты.Настроив Observables в диспетчере данных приложения, другие компоненты приложения могут подписаться, чтобы наблюдать за интересующими их переменными и реагировать на изменения.

Обычно я основываю свои разработки приложений на базе Java на Android на основе удивительного Android MVPАрхитектура от Mindorks, которая широко использует RxJava и Observables.

https://github.com/MindorksOpenSource/android-mvp-architecture

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...