Android / Java:观察主类的变量变化

时间:2013-06-12 12:06:02

标签: java android class

我不想检查我的xClass中的变量是否从我的主类中更改。事实是,我的变量只在单击ImageView并且在线程中运行时才会更改,所以我想要#39 ;当我改变变量时,在我的主类中检查一段时间循环(我不知道是否可能)。这是我尝试过的,但是当我运行程序时它就停止了,什么都不做。

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

所以这是我的线程,而Counter是我想看的值。我使用get方法返回值。

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

因此,这表明值已更改(Counter是全局变量)。 这就是我在主要课程中所做的。

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

这是我的程序实际停止运行的地方。我无法想到任何其他方式来获取价值变化的指标。

感谢任何帮助,谢谢。

4 个答案:

答案 0 :(得分:2)

这听起来像observer pattern的好选择。你在这里要做的是不是通过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函数,该函数会在更新值时执行您想要执行的操作。

其他信息: 一般来说,你会有一个观察者列表而不是一个。但是,如果您知道在任何给定时间只有一名观察者,那就足够了。

答案 1 :(得分:0)

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

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

new Thread() {
    @Override
    public void run() {
        while (true) {
            if (xClass.getCounter()) {
                //your code
            }
        }
    }
}.start();

答案 2 :(得分: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
}

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

答案 3 :(得分:0)

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

1)我建议您刷新命名约定。以大写字母开头的对象名称通常是为类名保留的,例如查看,活动,CustomClass等 由于我假设你的计数器是一个变量,我称之为“计数器”而不是“计数器”。

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

3)别忘了,你必须在线程上调用start()函数来实际运行代码。

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