Android 不释放MediaPlayer会导致电池耗尽

Android 不释放MediaPlayer会导致电池耗尽,android,service,cpu,battery,Android,Service,Cpu,Battery,我正在开发一个应用程序,它使用MediaPlayer对象从墙纸服务播放H.264 MP4视频,因为它是一个实时墙纸应用程序。如果使用MediaPlayer.pause()或MediaPlayer.stop()暂停/停止MediaPlayer,则当设备(Nexus 5,Android 6.0.1)处于空闲和睡眠状态时,会发生电池耗尽。夜间多次测试时,排水量约为3-7%/小时。使用mediaPlayer.release()释放媒体播放器后,电池电量会恢复到正常的1%/小时。当onVisibility

我正在开发一个应用程序,它使用MediaPlayer对象从墙纸服务播放H.264 MP4视频,因为它是一个实时墙纸应用程序。如果使用MediaPlayer.pause()或MediaPlayer.stop()暂停/停止MediaPlayer,则当设备(Nexus 5,Android 6.0.1)处于空闲和睡眠状态时,会发生电池耗尽。夜间多次测试时,排水量约为3-7%/小时。使用mediaPlayer.release()释放媒体播放器后,电池电量会恢复到正常的1%/小时。当onVisibilityChanged调用false时,我暂停/停止mediaPlayer。据报道,这款手机将在Android库存电池表和更好的电池数据中休眠

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


编辑:我发现了一个新现象,当在mediaPlayer.pause()之前调用mediaPlayer.setSurface(null)时,空闲电池的使用恢复正常。然后我可以执行mediaPlayer.setSurface(surface)将其设置回mediaPlayer.start()之前。问题是重新启动后几秒钟内出现了一些黑色伪影。

我不能给你一个准确的答案,但可以告诉你要寻找什么。我怀疑是pause()频繁地检查事件,以防止处理器进入深度睡眠/C状态。相反,stop()不需要检查事件,因此允许处理器进入深度睡眠状态。几年前我写过信

我怀疑函数的编写者决定更频繁地进行检查。这是一个非常常见的错误,因为开发人员认为更短的睡眠时间/更频繁的检查会导致更好的响应(这几乎从来没有做到)。您可以使用实际检查硬件睡眠状态的处理器电源监视器来检查这一点。不幸的是,大多数都没有,而且只检查处理器独立的“等价物”

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

  • 检查允许您设置 正在检查暂停()的间隔。顺便说一句,我不知道有
  • 写你自己的。当然,这会使编写独立于平台的应用程序变得复杂
  • 请使用已正确执行此操作的其他媒体播放器
  • 不断地攻击谷歌直到它被修复
  • 就像我说的,这些都不是很令人满意。顺便说一句,在网上搜索时,我发现证据表明,在新的Android版本中,这种情况已经发生了不止一次


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

    我不能给你一个准确的答案,但可以告诉你要寻找什么。我怀疑是pause()频繁地检查事件,以防止处理器进入深度睡眠/C状态。相反,stop()不需要检查事件,因此允许处理器进入深度睡眠状态。几年前我写过信

    我怀疑函数的编写者决定更频繁地进行检查。这是一个非常常见的错误,因为开发人员认为更短的睡眠时间/更频繁的检查会导致更好的响应(这几乎从来没有做到)。您可以使用实际检查硬件睡眠状态的处理器电源监视器来检查这一点。不幸的是,大多数都没有,而且只检查处理器独立的“等价物”

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

  • 检查允许您设置 正在检查暂停()的间隔。顺便说一句,我不知道有
  • 写你自己的。当然,这会使编写独立于平台的应用程序变得复杂
  • 请使用已正确执行此操作的其他媒体播放器
  • 不断地攻击谷歌直到它被修复
  • 就像我说的,这些都不是很令人满意。顺便说一句,在网上搜索时,我发现证据表明,在新的Android版本中,这种情况已经发生了不止一次


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

    谢谢你的建议。查看pause()会发现一个我无法检查的本机方法。我发现的新情况是,如果我在mediaPlayer.pause()之前使用mediaPlayer.setSurface(null),空闲电池的使用就会恢复正常。然后我可以执行mediaPlayer.setSurface(surface)将其设置回mediaPlayer.start()之前。问题是有一些黑色工件在重新启动后几秒钟内执行此操作。新编辑:mediaPlayer.stop()也会发生同样的情况。如果不执行mediaPlayer.release(),电池电量将继续耗尽。感谢您的建议。查看pause()会发现一个我无法检查的本机方法。我发现的新情况是,如果我在mediaPlayer.pause()之前使用mediaPlayer.setSurface(null),空闲电池的使用就会恢复正常。然后我可以执行mediaPlayer.setSurface(surface)将其设置回mediaPlayer.start()之前。问题是有一些黑色工件在重新启动后几秒钟内执行此操作。新编辑:mediaPlayer.stop()也会发生同样的情况。如果不执行mediaPlayer.release(),电池电量将继续耗尽。