MediaPlayer 在单独的线程中与通过 startForeground() 在服务中运行

2024-02-03

所以,我在一个单独的线程中流式传输音乐。如果我离开应用程序(onPause(), onStop()被呼叫等),音乐继续播放,但最终 - 在打开其他应用程序并在它们之间切换并返回主屏幕之后 - 我的应用程序被终止。没有崩溃,只是一个WIN DEATH and process com.myapp.android has died在 logcat 中。显然,系统为了回收资源而销毁应用程序是合法的。

我的问题是:在主(UI)线程之外的线程中运行内容是否意味着就系统而言,它现在的优先级较低?意思是,它比我在一个文件中运行媒体播放器更有可能被杀死吗?Service甚至使用startForeground()让服务在前台运行?

任何想法或澄清将不胜感激!

EDIT

另外,有关服务的部分文档让我感到困惑。在相关部分,它指出:

注意:服务在其托管进程的主线程中运行 - 服务不会创建自己的线程,也不会在线程中运行 单独的过程(除非您另外指定)。这意味着,如果 您的服务将执行任何 CPU 密集型工作或阻塞 操作(例如 MP3 播放或联网),您应该创建一个 服务中的新线程来完成这项工作。

我总是在主线程上的服务中运行 MP3 播放,并且 UI 保持响应。如果我应该按照上面引用中的建议将其放在一个单独的线程中,那么我最终不会回到开始的地方,即媒体播放发生在主线程之外,从而增加播放的可能性当打开其他应用程序等时被杀死?


我刚刚在其他地方发布了这个答案的一部分,但它仍然相关。

不幸的是,调用prepareAsync()根本不足以避免ANR提示和您的应用程序挂起几秒钟,特别是当您正在从网络播放文件时。最好的选择是将 MediaPlayer 实例放在自己的线程中,或者至少在处理程序中执行密集调用(例如 mediaplayer.start())。我已经使用 MediaPlayer 一年多了,我可以告诉你,根据具体情况,它肯定会在各种调用后挂起。

理想情况下,您应该生成一个从服务控制 MediaPlayer 的线程。这样,您可以确保您的媒体在您的应用程序处于后台时继续播放,并且任何阻塞调用(除了prepare()/prepareAsync())都不会挂起您的应用程序。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MediaPlayer 在单独的线程中与通过 startForeground() 在服务中运行 的相关文章

随机推荐