将数据从一个回调传递到另一个回调的机制
Mechanism for passing data from one callback to another
我想在我的应用程序中使用 Speech to text 进行操作,例如单击是或否按钮。
我在我的应用程序中实现了语音转文本。
因为我有一个回调方法叫做
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()
方法为此使用 Handlers。
但是我不知道在不涉及主线程的情况下如何实现它。因为我的其他任务在单独的线程中。
任何人都可以帮我做一个原型吗?或者只是数据流过程会很有帮助。
对于这种需要与不同任务和线程进行交叉通信的回调逻辑,我通常使用 Android (RxAndroid) 的 Reactive Extensions,特别是 Observables。
https://github.com/ReactiveX/RxAndroid
您可以在不同的线程上创建和观察 Observables,基本上是订阅观察一个变量,然后当值发生变化时,您的应用程序逻辑可以响应变化。
在此处阅读有关多线程和 RxJava 的更多信息:
https://blog.gojekengineering.com/multi-threading-like-a-boss-in-android-with-rxjava-2-b8b7cf6eb5e2
根据您应用的架构,实现此目的的一个好方法是拥有一个中央应用数据管理器,其他组件可以访问该管理器。通过在 App Data Manager 上设置 Observables,其他应用程序组件可以订阅以观察他们感兴趣的变量并对变化做出反应。
通常我基于 Java 的 Android 应用程序设计基于来自 Mindorks 的令人惊叹的 Android MVP 架构,它广泛使用 RxJava 和 Observables。
https://github.com/MindorksOpenSource/android-mvp-architecture
Bus-Message(面向事件)方式可以解决您的问题。 F.e。我们有 SomeEventHappenedMessage class 里面有一些数据。当某些事件发生时,消息通过总线发送,监听器将获得它。
可以自己写总线或者使用EventBus库https://github.com/greenrobot/EventBus发送和获取messages/events。
伪代码:
//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)
我想在我的应用程序中使用 Speech to text 进行操作,例如单击是或否按钮。 我在我的应用程序中实现了语音转文本。
因为我有一个回调方法叫做
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()
方法为此使用 Handlers。
但是我不知道在不涉及主线程的情况下如何实现它。因为我的其他任务在单独的线程中。
任何人都可以帮我做一个原型吗?或者只是数据流过程会很有帮助。
对于这种需要与不同任务和线程进行交叉通信的回调逻辑,我通常使用 Android (RxAndroid) 的 Reactive Extensions,特别是 Observables。
https://github.com/ReactiveX/RxAndroid
您可以在不同的线程上创建和观察 Observables,基本上是订阅观察一个变量,然后当值发生变化时,您的应用程序逻辑可以响应变化。
在此处阅读有关多线程和 RxJava 的更多信息:
https://blog.gojekengineering.com/multi-threading-like-a-boss-in-android-with-rxjava-2-b8b7cf6eb5e2
根据您应用的架构,实现此目的的一个好方法是拥有一个中央应用数据管理器,其他组件可以访问该管理器。通过在 App Data Manager 上设置 Observables,其他应用程序组件可以订阅以观察他们感兴趣的变量并对变化做出反应。
通常我基于 Java 的 Android 应用程序设计基于来自 Mindorks 的令人惊叹的 Android MVP 架构,它广泛使用 RxJava 和 Observables。
https://github.com/MindorksOpenSource/android-mvp-architecture
Bus-Message(面向事件)方式可以解决您的问题。 F.e。我们有 SomeEventHappenedMessage class 里面有一些数据。当某些事件发生时,消息通过总线发送,监听器将获得它。
可以自己写总线或者使用EventBus库https://github.com/greenrobot/EventBus发送和获取messages/events。
伪代码:
//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)