如何循环OnCompletionListener

时间:2018-04-03 01:29:19

标签: java android android-studio while-loop android-mediaplayer

我试图制作一个模拟收音机应用程序,其中包含大约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循环停止了所有内容,阅读文档和其他问题并不能解释原因。

1 个答案:

答案 0 :(得分:0)

您可以使用递归方法来解决问题。例如,如果您正在播放歌曲,则可以创建以下方法:

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循环来阻止您的代码。相反,您需要依赖侦听器发送的消息。