2013-06-04 2 views
0

У меня есть приложение Multi-Shot в приложении моей камеры. Для этого я использую следующий код.Приложение зависает, когда таймер выключен/включен часто

if (TIMER_STARTED) { 
    multishotTimer.cancel(); 
    multishotTimer.purge(); 
    multishotTimer = null; 
    TIMER_STARTED = false; 
} else { 
    multishotTimer = new Timer(); 
    multishotTimer.schedule(new TimerTask() { 

     @Override 
     public void run() { 
      TIMER_STARTED = true; 
      Camera camera = surfaceView.getCamera(); 
      camera.takePicture(null, null, 
        new HandlePictureStorage()); 
     } 
    }, 1000, 5000L); 
} 

Здесь TIMER_STARTED является логическим флагом, который показывает, запущен ли таймер или нет. HandlePictureStorage класс, который обрабатывает PictureCallback.

Вопрос: Когда я впервые нажимаю кнопку «MultiShot», он запускает таймер и снимает изображение каждые 5 секунд. Чтобы остановить таймер, я еще раз нажимаю на ту же кнопку. Но если я постоянно нажимаю на кнопку, приложение зависает и сила останавливается. Затем после того, как мне нужно выключить устройство из-за того, что камера используется остановленным сервисом и не может ее легко отпустить. Как я могу управлять таймером запуска и остановки?

ответ

1

Вам не нужно TIMER_STARTED, чтобы выбрать, будет ли кнопка запускаться или останавливаться на мультишоте: вы можете просто проверить if (multishotTimer != null).

Но даже после этого исправления щелчок слишком быстро может быть опасным: вы не должны создавать новый таймер между takePicture и HandlePictureStorage.

private bool isCapturing = false; 

@Override 
public void onClick(View v) { 
    if (multishotTimer != null) { 
     multishotTimer.cancel(); 
     multishotTimer.purge(); 
     multishotTimer = null; 
    } 
    else if (!isCaptureing) { 
     multishotTimer = new Timer(); 
     multishotTimer.schedule(new TimerTask() { 

      @Override 
      public void run() { 
       isCapturing = true; 
       Camera camera = surfaceView.getCamera(); 
       camera.takePicture(null, null, 
        new HandlePictureStorage()); 
      } 
     }, 1000, 5000L); 
    } 
} 

class HandlePictureStorage implements ... { 
    @Override 
    public void onPictureTaken(...) { 
     isCaptureing = false; 
    } 
} 
+0

Позвольте мне попробовать ваши изменения кода. :) –

+0

У меня есть ключ от вашего ответа и исправлена ​​проблема. :) –

0

Вам необходимо переместить TIMER_STARTED = true; из задачи таймера на часть else, например, после расписания таймера.

Чтобы повысить производительность, вы должны создать поле TimerTask вместо воссоздания анонимного класса при каждом создании и запуске таймера.

+0

, но если я перемещаю TIMER_STARTED в другую часть, он отключается на 5 секунд, а затем на некоторое время разрешает «отключать» мультишоу. –

Смежные вопросы