Android Timer而不是Thread.sleep,用于通过LED发送二进制代码

时间:2017-09-28 08:18:45

标签: java android timer thread-sleep

我正在使用应用程序通过打开/关闭智能手机的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次?

1 个答案:

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

}