将数据从一个回调传递到另一个回调的机制

时间:2019-02-25 07:20:37

标签: android multithreading handler android-handler

我想在我的应用程序中使用语音来文本,例如单击是或否按钮。 我在我的应用中将语音转换成文本。

因为我有一个称为的回调方法

   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()方法使用处理程序。 但是我不知道在不涉及主线程的情况下如何实现它。因为我的其他任务在单独的线程中。

任何人都可以为我提供原型的帮助,或者只是数据流过程会真正有用。

2 个答案:

答案 0 :(得分:1)

对于这种回调逻辑,需要与不同的任务和线程进行交叉通信,我通常使用Android的Reactive Extensions(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

答案 1 :(得分:1)

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)