android leakcanary和修正内存泄露
本文是通过用leakcanary来监测是否内存泄露或者溢出,对有这种问题的进行改正。
1.添加依赖,leakcanary2.0以上版本不用在application做实例化
点击查看代码
debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.7'
2.写2个activity类来回跳转,方便测试。这里只贴第二个类的代码。
点击查看代码
class twoAct: AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_two)
var myTo:Button=findViewById(R.id.bt_two)
myTo.setOnClickListener {
finish()
}
val leakThread = LeakThread()
leakThread.start()
}
// LeakThread 定义为 LeakTestActivity 的内部类
//非静态内部类 LeakThread 有问题的代码
inner class LeakThread : Thread() {
override fun run() {
super.run()
try {
//线程内耗时操作
sleep(6 * 60 * 1000)
} catch (e: InterruptedException) {
e.printStackTrace()
}
}
}
}
2个页面反复来回跳转,然后发现leakcanary弹窗,提示内存泄露。点击myTo按钮时,执行回收销毁twoAct的finish()方法,但是LeakThread类还持有它导致内存泄露。
3.修正 把LeakThread改为静态内部类
点击查看代码
//静态内部类
companion object {
class LeakThread : Thread() {
override fun run() {
super.run()
try {
sleep(6 * 60 * 1000)
} catch (e: InterruptedException) {
e.printStackTrace()
}
}
}
}

浙公网安备 33010602011771号