1

我不想检查我的 xClass 中的变量是否从我的主类更改。问题是,我的变量仅在单击 ImageView 并且在线程中运行时才会更改,所以我暂时不想检查更改变量时,在我的主类中循环(我不知道这是否可能)做某事。所以这就是我尝试过的,但是当我运行程序时它就停止了,什么也不做。

Thread setBack = new Thread() {
            public void run() {
                knight.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Counter++;
                        //also have some code here.
                    }
                }
};

所以这是我的线程,计数器是我想看的值。我使用 get 方法来返回值。

public boolean getCounter(){
            if(Counter>=1){
                return true;
            }
            return false;
}

所以这表明值发生了变化(计数器是全局变量)。这就是我在主课上所做的。

while (true) {
    if (xClass.getCounter()) {
        // do something
    }
}

这是我的程序实际上停止运行的地方。我想不出任何其他方法来获取值已更改的指示符。

任何帮助表示赞赏,谢谢。

4

4 回答 4

2

对于观察者模式来说,这听起来是个不错的选择。您在这里要做的不是通过Counter++而是使用函数来更改变量,例如

private void incrementCounter() {
  Counter++;
  observer.notify();
}

还将以下内容添加到您的xClass.java

private VariableChangeObserver observer;

public void register(VariableChangeObserver observer) {
  this.observer = observer;
}

然后,您可以Main.java实现如下接口:

public interface VariableChangeObserver {
  /**
   * Called whenever the variable is changed.
   */
  public void notify();
}

最后但并非最不重要的一点是,notify()向您的函数添加一个函数,该函数Main.java在值更新时执行您想做的任何事情。

附加信息: 一般来说,您将拥有一个观察者列表,而不仅仅是一个。但是,如果您知道在任何给定时间您只会有一个观察者,这就足够了。

于 2013-06-12T12:53:30.927 回答
0

不是最漂亮的解决方案,但您可以在 xClass 中使用静态布尔标志。由于您知道只有在单击 imageview 后才会更改变量的值,因此您可以在修改变量后立即设置 flag=true。

knight.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        Counter++;
        mainClassObject.callBackFunction();
        //also have some code here.
    }
}

在 Main 类中,您需要定义处理变量更改的回调函数。

public static callback(int newValue){
    //handle here
}

无限while循环几乎不应该被用作实际问题的解决方案。更喜欢事件驱动模型。

于 2013-06-12T12:32:56.700 回答
0

我不完全理解你的代码的意图,所以我会尽力回答。

1)我会建议你复习一下你的命名约定。以大写开头的对象名称通常保留给类名称,例如 View、Activity、CustomClass 等。由于我假设您的计数器是一个变量,因此我将其称为“计数器”而不是“计数器”。

2)在主“线程”中有循环实际上很好(我假设你的意思是线程,而不是类),如果这是你打算做的,但要小心它会阻止主线程做除了执行该特定循环之外的任何其他内容。

3) 别忘了,你必须调用线程上的 start() 函数才能真正让它运行代码。

4) 在后台线程中处理 UI 元素时,请确保在 runOnUiThread() 中调用对 UI 的任何更改。请参阅如何使用 runOnUiThread

于 2013-06-12T12:33:28.177 回答
0

因为您while(true)在主线程中运行并且它阻塞了应用程序。

将其放入Thread并启动它。这样它就不会阻止应用程序,而是会做你想做的事。

new Thread() {
    @Override
    public void run() {
        while (true) {
            if (xClass.getCounter()) {
                //your code
            }
        }
    }
}.start();
于 2013-06-12T12:07:27.657 回答