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()
                }
            }
        }
    }
posted @ 2026-10-21 20:57  xiao250  阅读(3)  评论(0)    收藏  举报