Kotlin匿名内部类持有外部类的引用,导致内存泄漏的解决方案

文章讨论了在Android开发中,由于匿名内部类对外部变量的引用可能导致内存泄漏的问题。通过使用WeakReference来存储外部变量,可以避免这种内存泄漏,确保当Activity不再使用时,可以被正确地回收。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、问题代码:

匿名内部类AudioPlayer.OnPlayListener,引用了外部的 musicAdapter变量导致内存泄漏:

AudioPlayer.get().setPlayListener(object : AudioPlayer.OnPlayListener {
            override fun onMusicPlay() {
            }

            override fun onMusicPause() {
            }

            override fun onMusicStop() {
            }

            override fun onComplete() {
            }

            override fun onError() {
                Toaster.show("播放异常")
                musicAdapter?.stopPlay(false)
            }

        })

2、优化后的代码:

使用弱引用WeakReference 存储外部变量。

internal class MyListener(musicAdapter: MusicAdapter?) : AudioPlayer.OnPlayListener {
        var mActivityReference: WeakReference<MusicAdapter>

        init {
            mActivityReference = WeakReference(musicAdapter)
        }

        override fun onMusicPlay() {
        }

        override fun onMusicPause() {
        }

        override fun onMusicStop() {
        }

        override fun onComplete() {
        }

        override fun onError() {
            Toaster.show("播放异常")
            mActivityReference.get()?.stopPlay(false)
        }
    }
 AudioPlayer.get().setPlayListener(MyListener(musicAdapter))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值