我正在使用应用程序通过打开/关闭智能手机的LED来传输二进制代码。在for循环中,应用程序从二进制代码的char变为char,如果有一个" 1"它会使LED闪烁100ms,如果有" 0"它刚刚关闭100毫秒。二进制代码也被发送3次。这里是我使用的代码的一部分:
public void turnOnOff() {
if (button) {
button = false;
Camera.Parameters parametersOn = camera.getParameters();
Camera.Parameters parametersOff = parameters;
parametersOn.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
parametersOff.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
try {
for (int a = 0; a < 3; a++){
for (int i = 0; i < data.length(); i++){
if (data.charAt(i) == '1') {
camera.setParameters(parametersOn);
camera.startPreview();
Thread.sleep(100);
} else {
camera.setParameters(parametersOff);
camera.startPreview();
Thread.sleep(100);
}
}
}
} catch (Exception e) {
}
}
button = true;
}
它确实有效,但不幸的是Thread.sleep()函数在时间上并不十分精确。当我输入Thread.sleep(100)时,它总是超过100毫秒。所以我尝试更改代码并使用timer.schedule()方法的计时器,因为我希望它更准确。但我无法弄清楚如何使它与计时器一起工作。
有人可以告诉我如何让这个任务与计时器一起工作,所以&#34;那些&#34;和&#34;零&#34;将以100毫秒的间隔发送并重复3次?
答案 0 :(得分:0)
Thread.sleep导致当前线程休眠至少100毫秒。这并不意味着在100毫秒内您的下一个语句将被执行。 Timer使用另一个线程,因此如果您需要在UI线程上执行某些操作,则必须将消息发布到UI线程。如果您需要延迟消息而不阻止UI线程 - 请使用Handler.post消息:
Handler handler = new Handler();
try {
for (int a = 1; a <= 3; a++) {
for (int i = 0; i < data.length(); i++) {
if (data.charAt(i) == '1') {
handler.postDelayed(new Runnable() {
@Override public void run() {
camera.setParameters(parametersOn);
camera.startPreview();
}
}, i * 100);
} else {
handler.postDelayed(new Runnable() {
@Override public void run() {
camera.setParameters(parametersOff);
camera.startPreview();
}
}, i * 100);
}
}
}
} catch (Exception e) {
}