MediaPlayer应该在单独的线程中运行吗?

smu*_*ult 15 streaming service multithreading android media-player

我正在构建一个从Web服务器流式传输音乐的应用程序.该应用程序具有使用MediaPlayer进行播放的前台服务.

我的代码基于此示例:http://developer.android.com/guide/topics/media/mediaplayer.html

在该示例中,除了prepareAsync()调用之外没有任何线程.令我困惑的是,当我阅读有关Service类的信息时,我会发现以下信息:

"警告:服务在其托管进程的主线程中运行 - 该服务不会创建自己的线程,也不会在单独的进程中运行(除非您另行指定).这意味着,如果您的服务将要执行任何操作CPU密集型工作或阻塞操作(如MP3播放或网络),您应该在服务中创建一个新线程来完成这项工作.通过使用单独的线程,您将降低应用程序无响应(ANR)错误的风险应用程序的主线程可以保持专用于用户与您的活动的交互."

我问的原因是应用程序有时(通常在失去连接时)会在流式传输音频时冻结UI.我完全理解,如果服务正在使CPU紧张工作,UI会冻结,因为活动和服务在同一个线程上运行.但是,我是否应该期待MediaPlayer如此激烈?也就是说,它应该在一个单独的线程上运行吗?

aja*_*n81 14

不幸的是,调用prepareAsync()根本不足以避免ANR提示和你的应用程序挂起几秒钟,特别是如果你正在从网络播放文件.最好的办法是将MediaPlayer实例放在自己的线程中,或至少在Handler中执行密集调用(如mediaplayer.start()).我已经使用MediaPlayer超过一年了,我可以告诉你它肯定会在各种电话后挂起,具体取决于具体情况.


Vis*_*nan -2

不,如果您正在进行任何网络传输,您应该将其保留在线程中,媒体播放器不是资源密集型的。将其保留在您的活动中。