我正在创建一个简单的摩尔斯电码应用。用户可以输入文本,然后将其翻译为Morse并在新线程上按顺序闪烁。我已经实现了一个for循环,用于打开/关闭相机闪光灯以代表莫尔斯序列。
问题在于,当用户离开活动时,on pause方法会释放相机但我有时会在发布后调用错误'方法。我不确定如何在释放相机时取消运行中的线程。我已经尝试使用在每次循环迭代开始时检查的volatile布尔值,但是如果在任何其他时间取消循环但是开始则会导致错误。
有没有人对如何解决这个问题有什么想法/建议?
public void flashTranslation(String message) {
int offIntervalTime = 50;
char[] cArray = message.toCharArray();
for (int i = 0; i < cArray.length; i++) {
if (cArray[i] == '.') {
turnOn();
try {
Thread.sleep(50);
}catch(Exception e)
{
Log.d("One", "Two");
}
turnOff();
try {
Thread.sleep(offIntervalTime);
}catch(Exception e)
{
}
} else if(cArray[i] == ' ')
{
Log.d("EMPTY!", "EMPTY!");
try{
Thread.sleep(100);
}catch(Exception e)
{
}
}
else {
try{
turnOn();
Thread.sleep(dash);
}catch(Exception e)
{
}
try{
turnOff();
Thread.sleep(offIntervalTime);
}catch(Exception e)
{
}
}
}
}
答案 0 :(得分:1)
最简单的方法是取消线程,防止通过信号量进行并发访问。每次尝试在线程上闪烁时,都会检查线程是否被取消。伪代码:
Semaphore sem;
onPause(){
sem.take();
camera.turnOff();
camera.release();
thread.cancel();
sem.give();
}
thread.run() {
//This should be run before every call to turnOn or turnoff
sem.take();
if(isCanceled()) {
return;
}
turnOn();
sem.give();
}
onResume() {
new Thread.start();
}