今天调试app的时候,LeakCanary
提示开机视频页面SplashVideoActivity
出现内存泄漏。然后用Android Profiler
查看了一下,果然已经执行了finish
的SplashVideoActivity
还存在于内存中。其中罪魁祸首就是这个AudioManager
,它持有了SplashVideoActivity
的引用。
然后去网上查了一下VideoView
导致内存泄漏的问题,果然,原来是VideoView
自身的bug。有人在Google的 Issue Tracker
上提出了这个问题 Memory leak: VideoView prevents its activity from being GC’ed
导致这个问题的原因是
AudioManager
可能会长时间持有Context
,当使用者(这里即VideoView
)请求了音频的焦点却没有及时释放的时候。
大家提出了各自的规避方法,主要有两种方法,但原理都是一样,即让AudioManager
持有ApplicationContext
,而不是持有