不释放MediaPlayer会导致电池耗尽

时间:2015-12-24 18:08:21

标签: android service cpu battery

我正在使用MediaPlayer对象从WallpaperService播放H.264 MP4视频的应用程序,因为它是一个动态壁纸应用程序。如果我使用mediaPlayer.pause()或mediaPlayer.stop()暂停/停止MediaPlayer,则设备(Nexus 5,Android 6.0.1)处于空闲状态并且正在休眠时会发生电池耗尽。一夜之间多次测试,排水量约为3-7%/小时。一旦我用mediaPlayer.release()释放媒体播放器,电池耗尽就会恢复到正常的1%/小时。当onVisibilityChanged调用false时,我暂停/停止mediaPlayer。手机报告将在Android电池图表和Better Battery Stats中进入睡眠状态。

如果CPU成功进入睡眠状态,如何解释这种电池消耗?

编辑:我发现的新功能是在mediaPlayer.pause()之前调用mediaPlayer.setSurface(null)时,空闲电池使用恢复正常。然后我可以在mediaPlayer.start()之前将mediaPlayer.setSurface(surface)设置回来。问题是重启后几秒内会出现一些黑色瑕疵。

1 个答案:

答案 0 :(得分:0)

我无法给你一个确切的答案,但可以给你找什么。我怀疑发生的事情是pause()经常检查事件以防止处理器进入更深的睡眠/ C状态。相反,stop()不需要检查事件,因此允许处理器进入深度睡眠状态。几年前我写了an article on sleep states

我怀疑该函数的编写者决定更频繁地检查。这是一个非常常见的错误,因为开发人员认为较短的睡眠/更频繁的检查会导致更好的响应(几乎从不这样做)。您可以使用实际检查硬件睡眠状态的处理器电源监视器来检查此问题。不幸的是,大多数人并不只是检查与处理器无关的等同物"。

让我们回到你的问题:你能做些什么呢?我可以给你一些建议,但没有一个是非常令人满意的:

  1. 检查允许您设置的API或数据结构 检查暂停的间隔()。顺便说一句,我都不知道。
  2. 自己写。当然,这使编写平台独立的应用程序变得复杂
  3. 使用已正确完成此操作的其他媒体播放器
  4. 谷歌上的锤子,直到它被修复
  5. 像我说的那样,这一点都不令人满意。顺便说一句,在网上搜索时,我发现有证据表明这种情况不止一次发生在Android新版本中。

    祝你好运,让我们知道会发生什么。