LiveData所有者定义可能导致泄漏/保留

问题描述

我正在一个项目中,该项目在LiveData内使用Service实例。 我们通过Activity将服务初始化为绑定服务,因此我们使用bindService()unBindService()进行连接和断开连接。我们分别在“活动”生命周期的onResume()onPause()调用这些函数

class TestActivity: Activity() {
    lateinit var ourService: OurService
    val serviceConnection: ServiceConnection = object : ServiceConnection {
         override fun onServiceConnected(className: ComponentName,service: IBinder) {
            val binder = service as OurService.LocalBinder
            ourService = binder.getService()
            // Does this cause ourService to be retained beyond unbind the only client
            ourService.liveReading.observe(this@TestActivity,Observer {}
         }
    } 

    override fun onResume() {
           Intent(this,OurService::class.java).also { intent ->
            bindService(intent,serviceConnection,Context.BIND_AUTO_CREATE)
        }
    }

    override fun onPause() {
         unBindService(serviceConnection)
    }
}

         

我注意到在某些情况下,我在OurService的LiveData属性中获得了多个发射。我不知道这是否是因为将所有者设置为活动,该活动在onPause / onResume循环后仍然存在,导致该服务在onPause情况下不会被破坏,并因此导致在另一个onPause /循环之后将多个观察者分配给活动数据onResume。

解决方法

因为我看不到您的服务代码,所以您在这里需要注意两点

  1. 调用unBindService并不意味着您的服务将被销毁,您可以在https://developer.android.com/reference/android/app/Service这里检查服务生命周期
  2. 致电ourService.liveReading.observe(this@TestActivity,Observer {}时 您应该注意到,您正在使用TestActivity的LifecycleOwner。这意味着liveReading将在TestActivity调用DESTROYED状态时停止接收数据。在您的情况下,TestActivity不调用DESTROYED状态(仅调用onPause),因此liveReading仍接收数据,问题是当您的活动调用onPause时会发生什么?这是你的答案

在LifecycleOwner不活动的情况下更改数据时,将不会 接收任何更新。如果再次激活,它将收到 自动最后一次可用的数据