我正在尝试编写一个程序,用于检测耳机何时插入系统,然后在取下耳机时运行另一段代码。代码工作正常,但我面临的问题是设备的状态正在缓存,因此我拉出耳机后1分钟我的程序检测到它已被删除。 当我运行代码是一个无休止的循环时,会发生这种情况。
但是如果我不在循环中运行单个实例,它会立即在运行中显示正确的状态
这是代码:
public class Headphonecheck {
public static int hpfound = 0;
public static int hpnfound =0;
public static void isHeadphoneAvailable() {
while (true)
{
if (!AudioSystem.isLineSupported(Port.Info.HEADPHONE) && hpnfound ==0) {
System.out.println("NO HEADPHONE FOUND");
System.out.println("Do something else");
hpfound = 0;
hpnfound = 1;
} else {
if(AudioSystem.isLineSupported(Port.Info.HEADPHONE) && hpfound ==0){
System.out.println("HEADPHONE FOUND");
System.out.println("Do something");
hpnfound = 0;
hpfound =1;
}
}
} //close while
}
public static void main (String[] args){
isHeadphoneAvailable();
}
}
如果你删除while循环并运行代码它完全适合单次运行..即你插入耳机并运行代码它显示HEADPHONE FOUND然后当你删除耳机并运行代码它显示没有耳机找到。
在while循环中,如果你有耳机进入并运行代码它会显示HEADPHONE FOUND,然后如果你立即移除耳机,则需要大约50秒来显示没有耳机找到。这是因为它将缓存50秒然后清除缓存
如何阻止缓存或清除缓存
答案 0 :(得分:0)
你的目标潜伏期是什么?
你可以设置重复的“单次运行”吗? (例如,通过计时器?)
我希望while循环连续运行一个“切片”,并让它的响应与“切片”的大小和间距有关。但是线程通常不会提前50秒运行!即使50毫秒也有点过分。所以这不能解释你所获得的缓存量。
在任何情况下,像cpu一样运行while循环对于不经常发生的事件而言似乎很昂贵,并且可能仅需要50毫秒的精度? (目前,while循环正在测试连续的微秒甚至纳秒,而不是一个高支付测试。)每50毫秒重复一次轮询的Timer循环应该可以更好地利用资源。
另外一个注意事项,如果你采用Timer路由:ScheduledThreadPoolExecutor被吹捧为优于util.Timer,并且在Java 1.5及更高版本中被优先考虑,Goetz / Bloch / Lea /其他人在“Java Concurrency in Practice”中”。他们说它在处理未经检查的异常方面做得更好。
另一种可能性:在你的while循环中放置一个Thread.sleep(50)或某些值,这可能与使用TimerTasks相当。
我不能肯定这会解决这个问题,但至少“缓存”不会因此而变得如此之大,而且性能总体上会略有改善。
答案 1 :(得分:0)
好像你需要添加一个事件监听器。您并不想循环查找此信息,您希望在更改时收到通知。我以前没有亲自使用过这个系统,但看起来Line界面允许你为事件添加一个LineListener。
代码看起来像这样:
...
if(AudioSystem.isLineSupported(Port.Info.HEADPHONE) && hpfound ==0){
Line line = AudioSystem.getLine(Port.Info.HEADPHONE);
line.addLineListener(new LineListener() {
public void update(LineEvent event) {
switch (event.getType()) {
CLOSE: doSomethingOnClose();
STOP: doSomethingOnStop();
// etc...
}
}
});
}
...