在线程内释放相机

时间:2016-01-21 23:36:08

标签: android multithreading camera

我正在创建一个简单的摩尔斯电码应用。用户可以输入文本,然后将其翻译为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)
            {

            }
        }
    }
}

1 个答案:

答案 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();
}