0

我有以下代码:

    Task<Integer> task = new Task<Integer>() {
        @Override
        protected Integer call() throws Exception {
            Calendar tajm = Calendar.getInstance();
            int hour = tajm.get(Calendar.HOUR_OF_DAY);
            int minutes = 0;
            updateMessage(Integer.toString(hour));
            URL resource = getClass().getResource("classico.mp3");
            Media media = new Media(resource.toString());
            MediaPlayer mediaPlayer = new MediaPlayer(media);

            while (true) {
                try {
                    Thread.sleep(60000);
                    tajm = Calendar.getInstance();
                    if (tajm.get(Calendar.HOUR_OF_DAY) != hour) {
                        hour = tajm.get(Calendar.HOUR_OF_DAY);
                        updateMessage(Integer.toString(hour));
                        System.out.println("Hour has changed to: " + hour);

                        mediaPlayer.play();
                    } else {
                        hour = tajm.get(Calendar.HOUR_OF_DAY);
                        System.out.println("Hour has not changed, it's still: " + hour);
                        updateMessage(Integer.toString(hour));
                    }
                } catch (InterruptedException ie) {
                    //System.err.print("...");
                }
            }
        }
    };

这首歌只播放一次,在第一次换时。知道为什么吗?

我还有一个不相关的问题:我的 javafx 程序需要 20 秒才能启动这正常吗?这有点烦人;p 普通应用程序,只有 JavaSE 几乎立即启动。

4

2 回答 2

2

建议的替代方法 - 根据需要创建新玩家

我建议您每次想要播放 mp3 时都创建一个新的 MediaPlayer,而不是重复使用现有的 MediaPlayer。通过每次创建一个新的 MediaPlayer,您只需在需要时消耗媒体播放资源,而不是分配它们并让它们在播放时间之间闲置。

例如,将所有与媒体相关的调用一起调用,而不是在不同的点调用,并让垃圾收集器在不再需要媒体资源时将其丢弃。

Media media = new Media(resource.toString());
MediaPlayer mediaPlayer = new MediaPlayer(media);
mediaPlayer.play();

如何重用现有播放器(如果需要)

如果您确实想使用当前代码并重用相同的媒体播放器,那么您可以在 play 调用之前进行几次调用,以确保在随后的播放调用中,播放器尝试从头而不是结尾播放 mp3 (这导致无操作)。

mediaPlayer.setStartTime(Duration.ZERO);
mediaPlayer.seek(Duration.ZERO);
mediaPlayer.play();

建议 - 使用时间轴而不是任务定期触发播放您的 mp3

您真的不需要单独的线程和任务,这会增加一些复杂性,您可以使用时间轴每小时触发一次播放事件。

于 2013-08-29T19:52:01.977 回答
0

尝试使用 mediaPlayer.playFromStart()

另外:从您的 while 循环内部抛出的任何未经检查的异常都将退出您的程序。作为测试,您可以将当前的 catch(InterruptedException) 更改为 catch(Throwable) 并打印错误以查看是否是这种情况。

另一种方法是使用一个被调度的执行器来执行你的任务(参见 Javadoc 的 SceduleThreadPooExecutor)

于 2013-08-29T12:51:11.923 回答