android - 绑定(bind)服务泄漏内存

标签 android android-service android-service-binding leakcanary

我写了一个基本的bound service based on the Android documentation ,但 LeakCanary 告诉我服务正在泄漏。

  1. 是否存在泄漏或我是否错误配置了 LeakCanary?
  2. 如何编写不泄漏的绑定(bind)服务?

代码

class LocalService : Service() {

  private val binder = LocalBinder()
  private val generator = Random()

  val randomNumber: Int
    get() = generator.nextInt(100)

  inner class LocalBinder : Binder() {
    fun getService(): LocalService = this@LocalService
  }

  override fun onBind(intent: Intent): IBinder {
    return binder
  }

  override fun onDestroy() {
    super.onDestroy()
    LeakSentry.refWatcher.watch(this) // Only modification is to add LeakCanary
  }
}

如果我按如下方式从 Activity 绑定(bind)到服务,LeakCanary 会检测到服务已泄漏

class MainActivity: Activity() {

  private var service: LocalService? = null
  private val serviceConnection = object: ServiceConnection {
    override fun onServiceConnected(name: ComponentName?, binder: IBinder?) {
      service = (binder as LocalBinder).getService()
    }
    override fun onServiceDisconnected(name: ComponentName?) {
      service = null
    }
  }

  override fun onStart() {
    super.onStart()
    bindService(Intent(this, LocalService::class.java), serviceConnection, BIND_AUTO_CREATE)
  } 

  override fun onStop() {
    super.onStop()
    service?.let {
      unbindService(serviceConnection)
      service = null
    }
  }
}
┬
├─ com.example.serviceleak.LocalService$LocalBinder
│    Leaking: NO (it's a GC root)
│    ↓ LocalService$LocalBinder.this$0
│                               ~~~~~~
╰→ com.example.serviceleak.LocalService
​     Leaking: YES (RefWatcher was watching this)

最佳答案

我不知道现在回答是否晚了,但在阅读了你的问题后,我还在我的项目中设置了 leakCanary 并发现了这个漏洞。我确信这是因为内部 Binder 类持有外部类的引用,这里是服务。这就是为什么在您的泄漏日志中显示 LocationService 正在泄漏的原因。 我找到了@commonsguy here 的解决方案并用一个更简单的例子实现了解决方案 here .希望这可以帮助。继续编码,保持幸福。

关于android - 绑定(bind)服务泄漏内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56252205/

相关文章:

java - 如何将 UTC 时间转换为设备的本地时间?

java - fragment 数组上的 NullPointerException

android - Android上最 "death-resistant"的组件是什么?

java - 如何在android的拨号器(默认或股票拨号器)中启动服务

android - 后台持久服务的Activity不会被kill掉

android - flutter应用开发中的依赖问题

android - YII 中无法上传视频

android - 如何从下载服务更新 ListView 的行

android - 通知的后台服务不工作

android - 服务绑定(bind)链