【问题标题】:How to observe LiveData created by Service from UI/MainActivity/Fragments?如何从 UI/MainActivity/Fragments 观察 Service 创建的 LiveData?
【发布时间】:2020-09-28 13:24:52
【问题描述】:

我有一项不时更新数据的服务。我目前使用 sharedPreferences 来存储数据并使用 LocalBroadcast 在服务和 UI 之间进行通信。

我想改进它以使用 MutableLiveData,类似这样。

class MyService : Service() {
    private var mMyServiceCreatedData = MutableLiveData<String>()
    private var mData = ""

    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        ....
        mData = someData
        mMyServiceCreatedData.postValue(mData)
    }
}

我知道有 viewModel,但在这种情况下,它是生成数据的服务而不是 viewModel,所以我不知道它是如何为服务工作的。是否可以在 UI/MainActivity/Fragments 中观察 Service 创建的数据?

【问题讨论】:

  • 你能不能把它放到companion object 然后在你想要的地方做MyService.mMyServiceCreatedData
  • @tyczj 永远不会那样做。这就是现在应该这样做的方式。

标签: android android-service android-lifecycle android-livedata android-service-binding


【解决方案1】:

这有很多不同的方法,所以我不会详细介绍; Stack Overflow 不是围绕它构建的。

LiveData 只是一个价值持有者。当“观察者”开始“观察”您的事件时,您开始不得不考虑生命周期。

如果您不喜欢 LocalBroadcast 模式,那么您可以:

  1. 服务将值存储在存储库中,而不是发出/发布值。
  2. Repository 发出 flow 或公开 LiveData(我不喜欢 repos 中的 liveData 但没关系)。
  3. ViewModel(和 UI/Fragment/Act)最终将订阅此存储库(相同的实例,我假设您有依赖注入或传递您的引用),当它在范围内时。

这将所有部分解耦并允许它们彼此独立运行。

作为最后的手段,您始终可以bind 为您的活动提供服务,但我相信这是一个与此不同的用例。

【讨论】:

  • 对于我的用例,使用存储库是一种过度杀伤,并且会增加更多复杂性,因为我的数据准确地说只有 4 个字符串。我也尝试过使用 ``DataStore`` 但由于某种原因,在 UI 中没有观察到 DataStore 中的数据更改GlobalScope.launch { dataStoreManager.storeData(someData) } dataStoreManager.data1Flow.asLiveData().observe(this, { })
  • 我想还是留在 LocalBroadcast 上比较好
  • 老实说,如果您有“4 个字符串”,请继续使用 LocalBroadcast :) 您甚至可以对所有 4 个字符串使用简单的值持有者并同时广播它们(全部 4 个),一次或类似。
  • 必须将广播从服务发送到 UI、收听并采取行动,然后将 UI 点击作为广播从 UI 发送回服务然后采取行动,代码可能会变得非常混乱 :-) 无论如何,感谢您的输入,这对很多人都有帮助!
  • 它可能会变得混乱和烦人,但问题会转移到下一个:你真的需要你的服务来拦截所有这些“事件”吗?该服务应仅用作链的最后“手段”。如果您的工作依赖于 UI 的存在,那么 Service 不太可能是最佳选择,另一方面,如果您不关心 UI,那么您不应该关心服务中的 UI 事件,那些应该在其他地方处理,并且只有对服务有用的操作应该冒泡到它。也许重新考虑你如何使用它可能有助于消除代码纠缠:)
猜你喜欢
  • 1970-01-01
  • 2018-05-10
  • 2019-01-24
  • 1970-01-01
  • 1970-01-01
  • 2020-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多