Android 计时器而不是 Thread.sleep 用于通过 LED 发送二进制代码
Android Timer instead of Thread.sleep for sending binary code via LED
我正在开发一个应用程序,通过切换 on/off 我智能手机的 LED 来传输二进制代码。在 for 循环中,应用程序从二进制代码的一个字符转到另一个字符,如果有一个“1”,它会使 LED 闪烁 100 毫秒,如果有一个“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() 方法的计时器,因为我希望它更准确。但我就是不知道如何让它与计时器一起工作。
谁能告诉我如何让这个任务与计时器一起工作,所以 "ones" 和 "zeros" 将以 100 毫秒的间隔发送并重复 3 次?
Thread.sleep 导致当前线程休眠 至少 100 毫秒。这并不意味着在 100 毫秒内将执行您的下一条语句。定时器使用另一个线程,所以如果你需要在 UI 线程上执行一些操作,你必须 post 消息到 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) {
}
我正在开发一个应用程序,通过切换 on/off 我智能手机的 LED 来传输二进制代码。在 for 循环中,应用程序从二进制代码的一个字符转到另一个字符,如果有一个“1”,它会使 LED 闪烁 100 毫秒,如果有一个“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() 方法的计时器,因为我希望它更准确。但我就是不知道如何让它与计时器一起工作。
谁能告诉我如何让这个任务与计时器一起工作,所以 "ones" 和 "zeros" 将以 100 毫秒的间隔发送并重复 3 次?
Thread.sleep 导致当前线程休眠 至少 100 毫秒。这并不意味着在 100 毫秒内将执行您的下一条语句。定时器使用另一个线程,所以如果你需要在 UI 线程上执行一些操作,你必须 post 消息到 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) {
}