LiveData不会通知我的服务(LifecyclerOwner实现)观察者

时间:2020-07-21 21:38:19

标签: android android-livedata

作为序言,我已经有一个片段,该片段以与下面相同的方式观察LiveData,并且效果很好。出于某种原因,当尝试将该服务用作生命周期所有者时,我认为这引起了问题,并且未调用观察者。

我已经检查了答案here,但是由于我使用的是ViewModel / Dao的相同实例,所以这不是我的问题。 (我认为?如果我错了,请纠正我。)

我有一项服务,该服务从MattCarroll的Hover扩展了HoverMenuService。这些服务显示叠加的UI,因此我想观察服务中的一些LiveData来更新此UI。我使服务实现了LifecycleOwner,并基本上从the source code复制了LifecycleService的实现,因此我可以将服务用作生命周期所有者,并将Observers添加到LiveData。

这是我的服务

class MyHoverMenuService : HoverMenuService(), LifecycleOwner {

    val TAG = "MyHoverMenuService"

    val mDispatcher = ServiceLifecycleDispatcher(this)

    override fun onHoverMenuLaunched(intent: Intent, hoverView: HoverView) {
        Timber.i("onHoverMenuLaunched called.")
        val menu: HoverMenu = MyHoverMenu(this, application, ContextThemeWrapper(this, R.style.AppTheme))
        hoverView.setMenu(menu)
        hoverView.collapse()
    }

    @CallSuper
    override fun onCreate() {
        mDispatcher.onServicePreSuperOnCreate()
        super.onCreate()
    }

    @CallSuper
    override fun onBind(intent: Intent?): IBinder? {
        mDispatcher.onServicePreSuperOnBind()
        return super.onBind(intent)
    }

    @CallSuper
    override fun onStart(intent: Intent?, startId: Int) {
        mDispatcher.onServicePreSuperOnStart()
        super.onStart(intent, startId)
    }

    @CallSuper
    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        return super.onStartCommand(intent, flags, startId)
    }

    @CallSuper
    override fun onDestroy() {
        mDispatcher.onServicePreSuperOnDestroy()
        super.onDestroy()
    }

    @CallSuper
    override fun getLifecycle(): Lifecycle {
        return mDispatcher.lifecycle
    }


}

MyHoverMenu显示2个部分,但实际上ownerService变量会传递到此HoverDictionaryScreen类,在其中显示UI。

我的HoverDictionaryScreen

class HoverDictionaryScreen(
    private val ownerService: MyHoverMenuService
    , val application:Application
    , val context: Context
) : Content {
    private val applicationContext: Context = context.applicationContext
    lateinit var dictViewModel: DictionaryInterfaceViewModel
    ...
    fun createScreenView(): View {
        val container: ViewGroup = FrameLayout(ContextThemeWrapper(applicationContext, R.style.AppTheme))


        binding = DataBindingUtil.inflate(
            LayoutInflater.from(applicationContext),
            R.layout.fragment_dictionary_interface,
            container,
            false
        )
        dictViewModel = ViewModelProvider
            .AndroidViewModelFactory.getInstance(application)
            .create(DictionaryInterfaceViewModel::class.java)
        dictViewModel.totalEntries.observe(ownerService, Observer { totalEntries ->
            binding.numberOfEntries.text = "Total number of entries in database : $totalEntries"
        })
    ...

在我的DictionaryInterfaceViewModel中,totalEntries var是从dao初始化的。因此,本质上应该立即应用观察者(在我的片段中确实发生过)。

当我检查binding.numberOfEntries没有更新时,我还检查了未使用log语句调用观察者。

1 个答案:

答案 0 :(得分:1)

好的,所以我注意到我的ownerService.lifecycle.currentState从未达到STARTED。这是因为扩展Service的HoverMenuService覆盖/删除了onStart方法,所以我在这里:

@CallSuper
override fun onStart(intent: Intent?, startId: Int) {
    mDispatcher.onServicePreSuperOnStart()
    super.onStart(intent, startId)
}

这似乎并没有解决问题,但在ServiceLifecycleDispatcher.onServicePreSuperOnStart()的the docs中,它提到可以在onStart()onStartCommand()中使用,因此可以将其放入{ {1}}(在HoverMenuService抽象类中实现),我的服务生命周期现在达到STARTED状态,一切正常。

onStartCommand()