簡體   English   中英

Android Timer而不是Thread.sleep通過LED發送二進制代碼

[英]Android Timer instead of Thread.sleep for sending binary code via LED

我正在開發一個應用程序,用於通過打開/關閉智能手機的LED來傳輸二進制代碼。 在for循環中,應用程序從二進制代碼的char變為char,如果有一個“ 1”,它將使LED閃爍100毫秒;如果有一個“ 0”,則它會熄滅100ms。 二進制代碼也被發送了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)時,它總是超過100ms。 所以我嘗試更改代碼,並使用帶有timer.schedule()方法的計時器,因為我希望它更准確。 但我只是不知道如何使它與計時器一起工作。

有人可以告訴我如何使此任務與計時器一起使用,以便“ 1”和“ 0”以100ms的間隔發送並重復3次嗎?

Thread.sleep導致您當前的Thread睡眠至少100ms 這並不意味着您將在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) {

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM