2013-07-31 3 views
0

В моей программе логическое значение (называемое metronomeOn) должно быть установлено равным true нажатием одной кнопки, а false - кликом другой кнопки. Единственный класс, который у меня есть (MainActivity), реализует Runnable. Поэтому, после начала потока, в методе run, в зависимости от значения metronomeOn, он должен выполнить блок кода. Моя проблема заключается в том, что после метода onClick от кнопки, которая должна установить metronomeOn в значение true, значение metronomeOn не изменяется.Android: значение boolean не меняется?

ButtonListeners (метод вызывается в OnCreate):

public void ButtonListeners() { 
    bStart.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      metronomeOn = true; 
     } 
    }); 

    bStop.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      currentBeatIndex = 1; 
      tvCurrentBeatIndex.setText(""); 
      metronomeOn = false; 
     } 
    }); 
} 

Метод запуска:

if (metronomeOn) { 
     tvBpm.setText("IN IF STATEMENT"); 
     //other code... 
    } 

Я абсолютно не знаю, почему metronomeOn не переключающий значения. Я знаю, что запускается метод run, а metronomeOn всегда изменяется в onCreate и onDestroy. Любые идеи, почему это не работает? Заранее спасибо!!

EDIT * * ** * ** * ** * ** * ** * ** * ** * ** * ** Я избавился от метода run и реализации класса Runnable, поэтому проблем там нет, но metronomeOn все равно всегда возвращает false.

EDIT СНОВА * * ** * ** * ** * ** * ** * ** * ** * * I не знаю, почему и как, но после удаления Runnable и перезапуска Eclipse он теперь работает. MetronomeOn меняет стоимость! Спасибо всем, кто дал совет!

+0

Можете ли вы войти в систему и обеспечить, чтобы «ButtonListeners» вызывается? (Вы можете использовать pastebin.com весь свой класс.) «Активность реализует Runnable» запахи вонючие. – ataulm

+0

Можете ли вы поместить код, где вы объявили логическое? – JNL

ответ

0

Несколько возможных причин:

  • является metronomeOn volatile? Если переменная используется в потоках, вы должны ее пометить.
  • делает ваш запуск метод проверки метрономOn несколько раз? Как из кода, который вы отправили, он проверяется только один раз
  • Вы запускаете метод, как вы думаете? Как если бы это было сделано, и metronomeOn был установлен, ваша активность выйдет из строя, так как вам разрешен доступ к графическому интерфейсу из потока пользовательского интерфейса. Просто выполнение класса Runnable не вызывает появление нити. И вы можете вызвать метод run напрямую без потока.

Из маленьких деталей, которые мы видим в вашем приложении, я думаю, вы, вероятно, захотите использовать Службы вместо Threads/Runnables? Сервисы могут запускаться и останавливаться, запускаться независимо от Activity и также порождать потоки.

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

+0

Я очень ценю помощь от этого поста, но, к сожалению, это не сработало. Я даже избавился от всего запущенного/запущенного материала. Даже после этого metronomeOn все равно всегда возвращает false после завершения метода onClick. – hardyboy16jm

+0

Было бы полезно, если бы вы могли опубликовать код активности (или даже лучше: все связанные части кода, с окружающими вещами, снятыми), если еще что-то не работает должным образом. – dst

0

Невозможно определить точную проблему, но попробуйте сделать это наоборот. Назовите их method1 и method2 и использовать as--

public void method1(View v) { 
\\code for button1 
} 

public void method2(View v) { 
\\code for button2 
} 

И использовать в XML для соответствующих кнопок:

android:onClick="method1" 
android:onClick="method2" 
+1

«Решение» вопроса, не понимая, что преступник глуп. –

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