如何循环 OnCompletionListener

How to loop OnCompletionListener

我正在尝试创建一个模拟广播应用程序,其中包含将随机播放的大约 100 首歌曲,偶尔会用其他音频文件打断音乐。

这是给我带来麻烦的片段:

mp.start();
while(true)
mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
    public void onCompletion(MediaPlayer mPlayer) {
        radio.playRadio();
    }
});

我已经获得了与一些会挂起应用程序的无限循环一起工作的代码(我什至无法更改音量),这就是为什么我认为 OnCompletionListener 会打破它。相反,它甚至似乎没有进入 radio.PlayRadio 函数。

我期望发生的事情是程序从起始音频开始,然后在播放时进入 while 循环并在 OnCompletionListener 处停止。当它完成时,进入函数,在那里执行操作(设置媒体,播放它们),退出,然后循环回到等待完成。

如果我取出 while(true),它会进入函数,所以 while 循环会以某种方式停止一切,阅读文档和其他问题无法解释原因。

你可以使用递归的方法来解决这个问题。比如你正在播放歌曲,你可以创建如下方法:

private void playSong(Uri uri) {
  // this is just example, don't expect the code to works.
  MediaPlayer mp = new MediaPlayer();
  mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
  mp.setDataSource(getApplicationContext(), uri);
  mp.prepare();
  mp.start();
  mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
    public void onCompletion(MediaPlayer mPlayer) {
      // get the next uri here
      // assume there is next uri.
      playSong(nextUri);
    }
  });

}

您不应使用 while 循环来阻止您的代码。相反,您需要依赖监听器发送的消息。