title: app hanging on camera.release()
body: <p>I'm working on a flashlight app using the camera flash. It seems to work fine but on occasion calling camera.release() causes a hang for about a minute or so. I've included the code below. I've looked at a bunch of examples and I don't see anything that could cause such a thing. Any ideas?</p>
  
  <pre><code>    //latest
      public void setOn(boolean on, Context context) {    
  
      if (lock) {
          Log.i(TAG, "lock: true");
          return;
      }
  
  
      if (on) {           
          if (mCamera == null) {
              mCamera = Camera.open();
          }
  
          Parameters params = mCamera.getParameters();
          params.setFlashMode(MODE_TORCH);
          mCamera.setParameters(params);
          mCamera.startPreview();
      } else {
          if (mCamera != null) {              
              try {                   
                  Parameters params = mCamera.getParameters();
                  params.setFlashMode(MODE_OFF);
                  mCamera.setParameters(params);                  
              } finally {
                  new Thread(new Runnable() {
                      public void run() {
                          Log.i(TAG, "new Thread - start");
                          lock = true;
                          mCamera.setPreviewCallback(null);
                          mCamera.stopPreview();
                          mCamera.release();
                          mCamera = null;
                          lock = false;
                          Log.i(TAG, "new Thread - end");
                      }
                  }).start();                                     
              }
          }
      }
  }
  
  
  //original
  public void setOn(boolean on, Context context) {        
      Camera camera = mCamera;
      if (on) {           
          if (camera == null) {
              mCamera = camera = Camera.open();
          }
  
          Parameters params = camera.getParameters();
          params.setFlashMode(MODE_TORCH);
          camera.setParameters(params);
          camera.startPreview();
      } else {
          if (camera != null) {
  
              try {                   
                  Parameters params = camera.getParameters();
                  params.setFlashMode(MODE_OFF);
                  camera.setParameters(params);                   
              } finally {
                  camera.stopPreview();
                  camera.release();
                  mCamera = camera = null;
              }
          }
      }
  }
  </code></pre>