我试图制作一个模拟收音机应用程序,其中包含大约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循环停止了所有内容,阅读文档和其他问题并不能解释原因。
答案 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
循环来阻止您的代码。相反,您需要依赖侦听器发送的消息。