我想在我的应用程序中使用语音进行文本,以进行诸如单击"是"或"否"按钮之类的操作。我在应用程序中实现了文本的演讲。
我有一个叫做
的回调方法 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()
我的问题是如何创建这样的机制,以便我使用语音来回调结果数据并将其传递到不同任务的单独线程中并调用music.play()
或flashlight.on()
我尝试使用 sendmessage()
和 handlemessage()
方法将处理程序使用。但是,当不涉及主线程时,我无法弄清楚如何实现它。因为我的另一个任务是在单独的线程中。
任何人都可以为此提供原型,或者只是数据流过程真的很有帮助。
bus-message(面向事件)的方式适合您的问题。F.E.我们有 someventhappenedMessage 类,其中有一些数据。发生某些事件时,通过公共汽车发送消息,听众将获得它。
您可以编写自己的总线或使用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)
对于这种回调逻辑,需要与不同的任务和线程进行交叉通信,我通常使用Android(Rxandroid)的反应性扩展,特别是可观察的。
https://github.com/reactivex/rxandroid
您可以在不同的线程上创建和观察可观察物,基本上订阅以观察变量,然后当值更改时,您的应用逻辑可以对更改做出反应。
在此处阅读有关多线程和RXJAVA的更多信息:
https://blog.gojekengineering.com/multi-threading-like-a-a-boss-in-indroid-with-rxjava-rxjava-2-b8b7cf6eb5e2
根据您的应用程序的体系结构,做到这一点的好方法是拥有中央应用数据管理器,其他组件可以访问。通过在应用程序数据管理器上设置可观察到的物品,其他应用程序组件可以订阅以观察他们感兴趣的变量并对更改做出反应。
通常,我以Java为基础的Android App在Mindorks的惊人Android MVP体系结构上设计,该架构广泛使用RXJAVA和可观察到。
https://github.com/mindorksopensource/android-mvp-architecture