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) {

}