我写了一个基本的bound service based on the Android documentation,但LeakCanary告诉我该服务正在泄漏.
>是否有泄漏或我是否配置了LeakCanary?
>如何编写不会泄漏的绑定服务?
编码
@H_502_11@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 } }
如果我通过以下方式从活动绑定到该服务,则LeakCanary检测到该服务已泄漏
@H_502_11@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 } } }
@H_502_11@┬ ├─ 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)
最佳答案