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

时间:2013-03-27 12:17:11

标签: android multithreading service streaming media-player

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

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

在示例中,除了prepareAsync()调用之外没有任何线程。令我困惑的是,当我读到Service类时,我发现了这个信息:

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

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

3 个答案:

答案 0 :(得分:13)

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

答案 1 :(得分:0)

流媒体音乐是否会导致主线程停止,直到音乐完成流式传输?这可能就是它降低速度的原因。

我不是专家,目前正在学习自己,但值得思考。

答案 2 :(得分:-2)

不,如果您正在进行任何网络传输,您应该将其保留在一个线程中,媒体播放器不是那么占用大量资源。保持活动。