2

我正在使用 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 版本的设备资源少得多,处理器速度较慢,所以如果资源有问题,它应该被终止。

4

1 回答 1

0

这里的问题是我在由服务管理的线程内创建了一个 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);
于 2019-01-24T22:52:16.823 回答