2014-01-08 19 views
1

Я разрабатываю программу, которая запускает цикл while в одной из своих локальных функций с именем Record(). Когда нажата кнопка с именем X, условие переменной становится истинным, а функция записи запускается. Я хочу, чтобы при нажатии другой кнопки Y условие было изменено и, следовательно, при остановке цикла. Проблема в том, что при запуске цикла он не прослушивает нажатие кнопки Y. Что мне делать. остановить цикл while, изменив его состояние на другую функцию. Пример кода, как показано ниже:Как изменить выражение while во время работы

// clicking Button Y 
private View.OnClickListener XonClickListener = new View.OnClickListener() { 
    @Override 
    public void onClick(View arg0) {    
      condition = true;    
      record();    
    } 
} 

// clicking Button Y 
private View.OnClickListener YonClickListener = new View.OnClickListener() { 
    @Override 
    public void onClick(View arg0) {    
      condition = false;   
    } 
} 

// Record function 
private void Record(){ 
    while (condition){   
      // do something 
    } 
} 
+0

Трудно точно сказать, что не так, без * фактического * кода (поскольку вы не знаете, что такое ошибка, вы, вероятно, не считаете, что это вызывает проблему). Однако, я предполагаю, что 'condition' не объявляется' volatile'. – chrylis

+0

Как вы получаете доступ к методу записи? – Nfear

ответ

0

кажется из вашего вопроса, что вы работаете, что while цикл в потоке пользовательского интерфейса (также известный как основной поток). Этот поток не должен выполнять какую-либо фактическую работу, кроме как управлять пользовательским интерфейсом (например, рисованием изображений) и управляться пользовательским интерфейсом (например, событиями нажатия кнопки обработки). Любая другая работа должна идти на другие темы. Поэтому, если вы используете цикл while в своем потоке пользовательского интерфейса, он недоступен для прослушивания событий нажатия кнопок.

Вы можете найти общее объяснение этого here, и есть много механизмов, которые могут помочь вам сделать вашу работу Record() асинхронно, такими как AsyncTask, для которых вы можете найти хороший учебник here. Мой личный фаворит - HandlerThread, просто потому, что он очень гибкий и легко расширяемый. Вам нужно будет understandLooper и Message концепций, хотя, чтобы извлечь максимальную выгоду из этого.

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