我想在我的应用程序中使用Speech来发送文本,例如单击是或否按钮。我在我的应用程序中将语音实现为文本。
在那我有一个叫回调的方法
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()
方法处理这个问题。但是当我没有涉及主线程时,我无法弄清楚如何实现它。因为我的其他任务是在单独的线程中。
任何人都可以帮助我为这个原型或只是数据流程过程真的很有帮助。
Bus-Message(面向事件)方式可以适合您的问题。 F.E.我们有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)
对于这种回调逻辑,需要与不同的任务和线程进行交叉通信我通常使用Reactive Extensions for Android(RxAndroid),特别是Observables。
https://github.com/ReactiveX/RxAndroid
您可以在不同的线程上创建和观察Observable,基本上订阅观察变量,然后当值更改时,您的应用程序逻辑可以响应更改做出反应。
在这里阅读有关多线程和RxJava的更多信息:
https://blog.gojekengineering.com/multi-threading-like-a-boss-in-android-with-rxjava-2-b8b7cf6eb5e2
根据应用程序的体系结构,执行此操作的一种好方法是使用其他组件可以访问的中央App Data Manager。通过在App Data Manager上设置Observable,其他应用程序组件可以订阅以观察他们感兴趣的变量并对更改做出反应。
通常,我将基于Java的Android应用程序设计基于Mindorks的惊人的Android MVP架构,后者广泛使用RxJava和Observables。
https://github.com/MindorksOpenSource/android-mvp-architecture