2015-07-24 3 views
1
public class CallEvent extends BroadcastReceiver{ 
public LEDController ledController = new LEDController(); 
public ApplicationSettings applicationSettings = new ApplicationSettings(); 
public boolean ring = false; 


@Override 
public void onReceive(Context context, Intent intent){ 
    if(intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(TelephonyManager.EXTRA_STATE_RINGING)){ 
     ring = true; 
     blink(); 
    }else if(intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(TelephonyManager.EXTRA_STATE_IDLE) || 
      intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(TelephonyManager.EXTRA_STATE_OFFHOOK)){ 
     ring = false; 
    } 
} 

public void blink(){ 
    Runnable r = new Runnable() { 
     @Override 
     public void run() { 
      while(ring){ 
       ledController.turnOnFlash(); 
       try { 
        Thread.sleep(applicationSettings.getDelayOn()); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
       ledController.turnOffFlash(); 
       try { 
        Thread.sleep(applicationSettings.getDelayOff()); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    }; 
    Thread blinkThread = new Thread(r); 
    blinkThread.start(); 
} 

}Остановить поток в андроида приложения

Я хочу создать во главе гонца, когда телефон звонит. Но я не могу остановить blinkThread. Я не знаю, что это не работает. Начал старт, когда доход от звонков, но не прекращается, когда происходит снижение звонка. Переменное кольцо меняется на «false», когда отклонение вызова, но поток все еще работает

+0

Возможно, вы не хотите использовать отдельную нить для этого, так как это замедляет работу телефона и потребляет дополнительную энергию аккумулятора. Вместо этого вы можете посмотреть этот ответ (http://stackoverflow.com/a/10207775/1659409), чтобы узнать, как вы могли это сделать. Когда вы больше не хотите мигать, вы просто устанавливаете флаг, чтобы не отправлять задачу снова. –

+0

использовать сервис для этого ... радиопередатчик не должен иметь собственную нить ... но вы можете начать сервис ... тогда вы можете отправить намерение прекратить мигать – Selvin

+0

вы используете blinkThread.interrupt(); ? – Paul

ответ

0

В общем, вы не принудительно останавливаете потоки, потому что это опасно. Вы устанавливаете флаг, который сообщает соответствующему потоку выйти из цикла потока в контролируемых условиях.

Ваша петля нить выглядит вдоль этих линий:

void run() { 
    while (shouldContinue) { 
    doThreadWorkUnit(); 
    } 
} 

А где еще вы установите переменную shouldContinue и ждать завершения потока:

... 
thread.shouldContinue = false; 
thread.join(); 
... 

(Все это, вероятно, не правильно Java, так как я не занимаюсь Java. Просмотрите его как псевдокод и измените для своей фактической библиотеки языка/потока/и т. Д.)

Источник: How to stop a thread?

+1

Вы не видите флаг кольца в OP? –

+0

@MarkW нет, он не ... он «гуглер» (вроде фермера rep): он находит ответ через google и вставляет его («как есть», без какой-либо добавленной стоимости, но, по крайней мере, он дает ссылку на источник) ... иногда ключевых слов недостаточно ... и ответ хороший, ** но не для заданного вопроса ** ... – Selvin

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