我试图使我的后置摄像头上的LED灯每N秒闪烁一次:
private void blink() {
for (int i = 0; i < 5; i++) {
turnOnLedLight();
try {
Thread.sleep(1000); // N = 1 second
}
catch (InterruptedException e) {
Log.e("Test", "Got interrupted.");
}
turnOffLedLight();
}
}
private static Camera camera = null;
private void turnOnLedLight() {
camera = Camera.open();
Parameters p = camera.getParameters();
p.setFlashMode(Parameters.FLASH_MODE_TORCH);
camera.setParameters(p);
camera.startPreview();
}
private void turnOffLedLight() {
camera.stopPreview();
camera.release();
camera = null;
}
上面的代码有效,但除了让线程进入睡眠状态之外还有更好的方法吗? blink
方法在doInBackground
中的AsyncTask
方法中调用。
更新
我意识到上面的代码使LED灯保持亮起N秒。我想知道是否有更好的方法让它保持N秒并保持N秒。
答案 0 :(得分:2)
我会通过alarmManager报警。你正在举起AsyncTask线程。从3.0开始,异步任务都共享一个线程并循环执行。这意味着在您有任何其他异步任务时,它将被阻止。此外,如果手机进入睡眠状态,警报会唤醒手机,如果手机在你的线程中进入睡眠状态,线程将暂停,并且会在当前闪烁状态下冻结,直到用户将其唤醒。
当你第一次想要相机时,我也会做一次Camera.open,当你不再需要它时释放它,而不是在每个turnOnLedLight中请求它(导致你获得并释放相机5次) )。现在,如果有人在您关闭时更换了应用程序并打开相机应用程序,您可能会被锁定无法再次使用相机(并且可能会崩溃)。
答案 1 :(得分:0)
如果您想让它更准确,可以使用System.currentTimeMillis(),例如:
long previousTimeMillis = System.currentTimeMillis();
int i = 0;
while(i < 5){
if(System.currentTimeMillis() - previousTimeMillis >= 1000){
turnOffLedLight();
previousTimeMillis = System.currentTimeMillis();
i++;
}else{
turnOnLedLight();
}
}
这就是你可以做些什么来让led保持开启和关闭N秒:
long previousTimeMillis = Sustem.currentTimeMillis();
boolean shouldTurnOnLight = true;
int i = 0;
while(i < 5){
if(System.currentTimeMillis() - previousTimeMillis >= 1000){
if(shouldTurnOnLight){
turnOnLedLight();
shouldTurnOnLight = false;
}else{
turnOffLedLight();
shouldTurnOnLight = true;
}
previousTimeMillis = System.currentTimeMillis();
i++;
}
}
答案 2 :(得分:0)
如果你的开/关周期是对称的,那么这是另一种方法:
public Boolean ledOn = false;
...
// Change the LED state once a second for 5 minutes:
CountDownTimer cdt = new CountDownTimer(30000, 1000) {
public void onTick(long millisUntilFinished) {
ledOn = !ledOn;
if (ledOn)
turnOffLedLight();
else
turnOnLedLight();
}
public void onFinish() {
Log.d(TAG, "LED is on? "+ ledOn.toString());
}
};
...
cdt.start();
...
cdt.cancel();
(编辑为更好地处理开始/停止。)