实时数据与处理程序和本地广播

2022-09-02 22:30:55

我有旧的Android / java代码,其中包含两个派生自,并且这些服务不在单独的进程中运行。IntentService

问题是关于从这些返回结果的方法。IntentService

一个服务通过使用 + 返回结果,以在主循环中运行代码:HandlerRunnable

new Handler(Looper.getMainLooper()).post(new Runnable() {
    @Override
    public void run() {
        MyApplication.get().setFoo(someThing);
    }
});

另一个是用于将消息发送到 ,并通过 中的消息订阅,并在 中取消订阅。LocalBroadcastManager.getInstance(this).sendBroadcast(in);ActivityActivityBroadcastReceiveronResumeonPause

我说得对吗,在这两种情况下,都可以用它来简化事情?LiveData

IntentService应该创建和谁想要结果应该它,当新数据到达时应该调用,或者可能有一些珊瑚礁来阻止使用这里?LiveDataobserveIntentServicepostValueLiveData


答案 1

我认为这不会帮助您将任何数据发送到其他组件。LiveDataService

从任何组件到其他组件的通信的问题在于,您通常不会获得对 的直接引用,因此您无法直接“订阅”通知。ServiceService

从理论上讲,如果在同一进程中运行,则可以绑定它,获取对对象的引用,然后直接执行订阅。但是,这通常是一种过度的杀戮,我没有看到这种模式被广泛使用。ServiceService

在您的示例中,有两种通信机制:

  1. 服务静态地到达应用程序对象并设置一些数据。这是通过全局状态进行通信,通常被认为是反模式。
  2. 通过本地广播管理器进行通信

从上述两种机制来看,我将只使用#2,不惜一切代价避免#1。

返回 .LiveData

为了能够从 中获取对象,您需要对该 .这通常是不可能的,除非你在同一进程中绑定,或者使用一些涉及全局状态的丑陋的黑客。LiveDataServiceServiceService

因此,在这方面的有用性非常有限。LiveData

顺便说一句,虽然LocalBroadcastManager没问题,但我发现这种机制太复杂和有限制性了。因此,如果在同一进程中运行,我更喜欢使用以便从其他组件进行通信(反之亦然)。ServiceEventBusService

您可以在我几天前编写的SQLite基准测试应用程序中看到这种通信的示例。在此应用程序中,将状态更改和测试结果发布为粘滞事件,并订阅这些事件。TestServiceEventBusTestActivity


答案 2

这两种方法都适用于使用LiveData,因为LiveData的目的是将其放在另一个线程上,并在发生更改时仍通知用户。似乎它肯定会被取代,你的IntentService会发布价值。只要让你的活动或任何需要注意变化的东西成为观察者。LocalBroadcastManager.getInstance(this).sendBroadcast(in);


推荐