在考虑解决方案之后,我不知道为什么这段代码无法正常运行。
如果我执行mediaPlayer.start()
,则线程会循环进入wait()
,但是当mediaPlayer
调用OnCompletionListener
时,notifyAll()
不会从wait()
唤醒,并永远在wait()
状态循环......
(假设' Music Thread'在课程开始时正确启动,与MediaPlayer
对象相同)
private synchronized void set()
{
while(mediaPlayer.isPlaying())
{
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//DO SOMETHING (THE PROBLEM IS THAT NEVER REACHES THIS CODE)
}
private synchronized void reproductor()
{
mediaPlayer.start();
mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public synchronized void onCompletion(MediaPlayer mediaPlayer) {
notifyAll(); //because mediaPlayer.isPlaying() changes
}
});
}
private class Music implements Runnable
{
@Override
public void run() {
try {
reproductor();
while(true) {
set();
Thread.sleep(500);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
另一方面,如果我在循环中使用相反的语句,它可以正常工作(!mediaPlayer.isPlaying()
),为什么?
答案 0 :(得分:0)
您没有通知您正在等待的同一个对象。您正在通知侦听器对象,该对象是实现侦听器接口的匿名类的实例。您需要将notifyAll()
限定为XXX.this.notifyAll()
,其中XXX
与包含set()
和reproductor()
方法的类相同。