有一个处理实时数据的应用程序,当某个事件发生时应该会发出蜂鸣声。触发事件每秒可能发生多次,如果哔声已经在播放,而另一个事件触发代码则应该忽略它(而不是中断当前的嘟嘟声并开始新的哔声)。这是基本的代码:我是否需要关闭音频剪辑?
Clip clickClip
public void prepareProcess() {
super.prepareProcess();
clickClip = null;
try {
clipFile = new File("C:/WINDOWS/Media/CHIMES.wav");
ais = AudioSystem.getAudioInputStream(clipFile);
clickClip = AudioSystem.getClip();
clickClip.open(ais);
fileIsLoaded = true;
} catch (Exception ex) {
clickClip = null;
fileIsLoaded = false;
}
}
public void playSound() {
if (fileIsLoaded) {
if ((clickClip==null) || (!clickClip.isRunning())) {
try {
clickClip.setFramePosition(0);
clickClip.start();
} catch (Exception ex) {
System.out.println("Cannot play click noise");
ex.printStackTrace();
}
}
}
的prepareProcess的方法获取开始时运行一次,playSound方法被调用每一个触发事件发生的时间。我的问题是:我需要关闭clickClip对象吗?我知道我可以添加一个actionListener来监视Stop事件,但由于事件频繁发生,我担心额外的处理会减慢实时数据收集。
该代码似乎运行良好,但我担心的是内存泄漏。上面的代码基于我在搜索网络时找到的示例,但该示例使用actionListener专门关闭Clip以“消除停止方法未实现时会发生的内存泄漏”。我的程序打算运行几个小时,所以任何内存泄漏都会导致问题。
我会说实话:我不知道如何验证我是否有问题。我使用的是Netbeans,运行内存分析器只是给了我一大堆我不知道如何阅读的东西。这应该是该计划的一个简单部分,我花了几个小时。任何帮助将不胜感激!
迈克尔
非常感谢回复。我同意你的看法,根据我给的代码,这似乎不成问题。但是(如你所说)我不知道Clip对象背后发生了什么。通过Netbeans内存分析器可以更多地发现,每次播放声音时都会分配一个新对象。但是,Live Object列永远不会增加,所以我假设这意味着垃圾收集立即处理它。奇怪的行为,但我会确保在测试过程中观看它,以确保它没问题。 再次感谢。 Michael – Michael 2010-05-11 05:16:44