【发布时间】:2013-07-25 04:37:19
【问题描述】:
我正在使用 MediaPlayer 播放循环音频。它需要在服务中播放。几秒钟后,它终止。我检查了我的服务是否仍在运行,并且确实如此。当我将代码移动到一个活动时,它运行良好并且永不停止。这使我相信问题与线程有关。在活动中,MediaPlayer 在 UI 线程上运行,但在我的服务中,它在自己的线程中运行,并且未绑定到 UI 线程。也许这与它有关。我还将我的 MediaPlayer 对象声明为私有静态字段,但这也无济于事。
Logcat 仅表示“媒体服务器死亡”,没有进一步的原因。
如果 MediaPlayer 需要在 UI 线程中运行,我将如何从服务或由该服务产生的任何线程中访问它?
我在 Android 4.1 上遇到了这个问题。代码大致如下:
class PlaySound implements Runnable
{
private static MediaPlayer mp;
public void run()
{
this.mp = MediaPlayer.create(this.context, R.raw.sound);
this.mp.setVolume(1, 1);
this.mp.setLooping(true);
this.mp.start();
do
{
// Do something until told to stop thread.
}
while (true);
}
}
我还将私有字段移到我的服务中,甚至删除了 do...while 以便线程可以在播放开始后立即终止,但这也无济于事。
编辑:
这似乎是 Android 4.1 中的一个问题。我在同一制造商的设备上在 2.3 上测试了我的应用程序,但没有遇到此问题。事实上,2.3 版设备的资源少得多,处理器也更慢,所以如果资源有问题,它应该被终止。
【问题讨论】:
-
我看不到你给
mp.prepare();打电话? -
create(): "为给定资源 id 创建 MediaPlayer 的便捷方法。成功后,prepare() 将已被调用,不得再次调用。"
-
我的错,没有注意到你正在使用
create()。我认为您应该发布更多服务代码以及您实际启动它的方式,以便我们提供帮助。 -
hi AndroidDev.你找到解决方案了吗?
-
在使用带有 resId 的 create 时无需调用 mp.prepare()。只需确保你的线程中有 sleep()-s,让 mp 有时间播放声音。
标签: android media-player