15

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

我的代码基于这个例子:http: //developer.android.com/guide/topics/media/mediaplayer.html

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

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

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

4

3 回答 3

14

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

于 2013-06-12T12:55:03.293 回答
0

流式音乐是否会导致主线程停止,直到音乐完成流式传输?这可能就是为什么它正在放慢速度。

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

于 2013-03-28T10:39:30.950 回答
-2

不,如果你正在做任何网络传输,你应该把它放在一个线程中,媒体播放器不是那么资源密集型。把它放在你的活动中。

于 2013-03-27T12:22:00.750 回答