1

在我的程序中,一个布尔值(称为metronomeOn)应该在单击一个按钮时设置为true,在单击另一个按钮时设置为false。我拥有的唯一类(MainActivity)实现了 Runnable。所以线程启动后,在run方法中,根据metronomeOn的值,应该会执行一段代码。我的问题是,在应该将metronomeOn 设置为true 的按钮的onClick 方法之后,metronomeOn 的值没有改变。

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...
    }

我完全不知道为什么节拍器不切换值。我知道运行方法被执行,并且节拍器只在 onCreate 和 onDestroy 中改变。任何想法为什么这不起作用?提前致谢!!

编辑* * ** * ** * ** * ** * ** * ** * ** * ** * ** 我已经摆脱了 run 方法和 Runnable 类的实现,所以没有那里有问题,但节拍器仍然总是返回错误。

再次编辑* * ** * ** * ** * ** * ** * ** * ** * * 我不知道为什么或如何,但是在删除 Runnable 的东西并重新启动 Eclipse 之后,它现在可以工作了。MetronomeOn 改变价值!感谢所有给予建议的人!

4

2 回答 2

1

多种可能的原因:

  • 是节拍器volatile吗?如果跨线程使用变量,则应标记它。
  • 您的运行方法是否多次检查节拍器?从您发布的代码来看,它只检查了一次
  • 您是否按照您的想法执行了 run 方法?就像设置了节拍器一样,您的 Activity 将崩溃,因为您只被允许从 UI 线程访问 GUI。仅仅使一个类实现Runnable不会导致产生一个线程。并且可以不通过线程直接调用run方法。

从我们看到您的应用程序的小部分来看,我认为您可能想要使用服务而不是线程/可运行对象?服务可以启动和停止,独立于 Activity 运行,也可以产生线程。

由于您无法从服务访问活动,您可以使用Log类中的 Android 日志记录方法进行调试输出。

于 2013-07-31T18:14:41.503 回答
0

无法弄清楚确切的问题,但请反过来尝试。将它们命名为method1and method2,并用作--

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

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

并在 xml 中用于各个按钮:

android:onClick="method1"
android:onClick="method2"
于 2013-07-31T18:10:37.420 回答