2011-09-03 2 views
2

У меня есть поток, работающий в службе ... способ его запуск выглядит примерно так:Остановка нити в качестве службы Android

class Consumer implements Runnable { 
    public void run() { 
     while(!finished){ 
      foo(); 
     } 
     cleanUp(); 
    } 

    ... 
} 

Я начинаю нить в onStartCommand методы обслуживания и Я хочу закрыть его, когда служба прекратится. Теперь, чтобы остановить поток, я устанавливаю переменную finished в true (в методе onDestroy).

public void onDestroy() { 
     ... 
     finished = true; 
     ... 
    } 

(оказывается, что он прекрасно работает, когда я отладки программы ->cleanUp будет называться, как и ожидалось)

Без ее отладки, cleanUp не будет называться. Кто-нибудь может мне это объяснить? Где моя ошибка? Спасибо

+1

Неосложненный многопоточный доступ к готовой переменной, вероятно, является большой частью вашей проблемы. –

ответ

0

Определенно проблема синхронизации нити, поскольку Debugger будет сериализовывать вещи для вас, и это работает.

Я бы предложил использовать сигнализацию, чтобы решить вашу проблему.

Один из способов после установки isFinished = TRUE; сделать wait (int timeout) и запустить цикл цикла (класс потребителя) для уведомления() ;. Таким образом, даже класс Consumer находится в плохом состоянии, вы все равно выходите после таймаута.

+1

darn, я нашел ошибку. В методе 'foo' я фактически обращался к блокирующей очереди, и поток ожидал в queue.take(), поскольку очередь была пуста. таким образом, он никогда не оценивал условие while. Я исправил это, прервав поток в 'onDestroy'. спасибо за ваш намек;) – kmera

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

  • Нет связанных вопросов^_^