에는 실시간 데이터를 처리하는 응용 프로그램이 있으며 특정 이벤트가 발생할 때 신호음이 울리기로되어 있습니다. 트리거링 이벤트는 초당 여러 번 발생할 수 있으며, 다른 이벤트가 트리거 될 때 경고음이 이미 재생 중이면 코드를 무시해야합니다 (현재 경고음을 중단하고 새 경고음을 시작하는 것과 반대).오디오 클립을 닫아야합니까?
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 방법은 처음에 한 번만 실행됩니다, 그리고 꺼내, 방법은 트리거 이벤트가 발생할 때마다 호출됩니다 여기에 기본 코드입니다. 내 질문은 : clickClip 개체를 닫아야합니까? Stop 이벤트를 모니터링하기 위해 actionListener를 추가 할 수 있다는 것을 알고 있지만, 이벤트가 자주 발생하므로 추가 처리가 실시간 데이터 수집 속도를 늦추 게 될까봐 걱정됩니다.
코드가 정상적으로 실행되는 것으로 보이지만 내 걱정은 메모리 누수입니다. 위의 코드는 그물을 검색하는 동안 찾은 예제를 기반으로하지만이 예제에서는 "stop 메서드가 구현되지 않은 경우 발생할 메모리 누수를 없애기 위해"Clip을 구체적으로 닫는 데 actionListener를 사용했습니다. 내 프로그램은 몇 시간 동안 실행되도록 설계되어있어 내가 가진 모든 메모리 누수로 인해 문제가 발생합니다.
솔직히 말해서 : 나는 문제가 있는지 여부를 확인하는 방법을 모른다. Netbeans를 사용하고 있으며 메모리 프로파일 러를 실행하면 읽는 법을 모르는 거대한 목록을 얻을 수있었습니다. 이것은 프로그램의 단순한 부분이라고 생각되며, 나는 그것에 시간을 보내고 있습니다. 어떤 도움이라도 대단히 감사하겠습니다! 자바
마이클
답변 해 주셔서 감사합니다. 나는 당신이 동의하는 코드에 기초하여 문제가되지 않는다고 동의한다. 그러나 (당신이 언급했듯이) 나는 Clip 객체의 장면 뒤에서 어떤 일이 일어나고 있는지 모른다.Netbeans 메모리 프로파일 러를 사용하면 사운드가 재생 될 때마다 새로운 객체가 할당 된 것처럼 보입니다. 그러나 Live Object 열은 결코 증가하지 않으므로 가비지 콜렉션이 즉시이를 처리한다는 것을 전제로합니다. 이상한 행동이지만, 테스트를하는 동안 그것을 지켜서 확인하는 것이 좋습니다. 다시 한 번 감사드립니다. 마이클 – Michael