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))