在 Java 中将包含它的对象设置为 null 后,如何使 MediaPlayer 停止?

How to make a MediaPlayer stop after the object that contained it was set to null in Java?

我为我的游戏创建了一个 Sound class,其中包含一个循环播放的 MediaPlayer(在出现问题的场景中)。如果包含 Sound 对象的对象设置为 null(以将其删除),则 MediaPlayer 会继续播放,直到它到达媒体的末尾,尽管它应该停止,因为它应该已设置为 null。或者这不是它的工作原理?

我在网上找到了以下帖子,但是其中none个和我有同样的问题:Link1, Link2

这是Sound class:

public classs Sound {

  MediaPlayer mediaPlayer;

  public Sound(String path){
    Media media = new Media(getClass().getResource("/audio/" + path).toString());
    mediaPlayer = new MediaPlayer(media);
  }

  public void loop(){
    //only called once after initialized
    mediaPlayer.setAutoPlay(true);
    mediaPlayer.setCycleCount(MediaPlayer.INDEFINITE);
    mediaPlayer.setOnEndOfMedia(new Runnable() {
        @Override
        public void run() {
            mediaPlayer.seek(Duration.ZERO);
            mediaPlayer.play();
        }
    });
    mediaPlayer.play();
  }
}

这是包含class的声音:

public class Level {

    private Sound soundTrack = new Sound("level_music.wav");

    public Level() {
        soundTrack.loop();
    }

这就是将包含声音的对象设置为 null 的方式:

public class Main{

  private Level level = new Level();
  //...
  public Main(){
    new Timer(15, new ActionListener() {

      @Override
      public void actionPerformed(ActionEvent e) {

        if(playerLeavesTheLevel()){
          level = null;
          //...
        }

    }
  }
}

这不起作用的唯一原因是移除顶级对象后,mediaPlayer 未设置为 null。

level = null 意味着您要告诉一个名为 level 的引用来保存值:nulllevel 之前指向的值仍然存在(并且仍在被 MediaPlayer 使用)。 level 只是不再指向它了。也许 MediaPlayer 有一个 stop() 方法,你可以使用它在玩家改变级别时停止播放声音?