我正在使用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设备的资源少得多,处理器也慢,所以如果资源出现问题就应该终止它。
答案 0 :(得分:0)
这里的问题是我在由Service管理的线程内创建了MediaPlayer。使用Handler(getMainLooper())启动和停止MediaPlayer。
final Handler handler = new Handler(getMainLooper());
handler.post(new Runnable() {
@Override
public void run() {
mediaPlayer.start();
}
});
handler.postDelayed(new Runnable() {
@Override
public void run() {
if (mediaPlayer.isPlaying()) {
mediaPlayer.stop();
}
}
, 30 * 1000);