Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/192.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android/Java:注意主类中的变量更改_Java_Android_Class - Fatal编程技术网

Android/Java:注意主类中的变量更改

Android/Java:注意主类中的变量更改,java,android,class,Java,Android,Class,我不想从我的主类中检查变量是否在我的xClass中更改。问题是,我的变量只有在单击ImageView并且该视图正在线程中运行时才会更改,所以当变量更改时,我不想在我的主类中检查while循环(我不知道这是否可能)。所以这就是我尝试的,但当我运行程序时,它只是停止,什么也不做 Thread setBack = new Thread() { public void run() { knight.setOnClickListener(new Vi

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

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
    }
}
这就是我的程序实际停止运行的地方。我想不出任何其他方法来获取该值已更改的指示器

非常感谢您的帮助。

因为您的
while(true)
在主线程中运行,它会阻止应用程序

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

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

这不是最漂亮的解决方案,但可以在xClass中使用静态布尔标志。因为您知道只有在单击imageview后才更改变量的值,所以可以在修改变量后立即将标志设置为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循环几乎不应该被用来解决实际问题。更喜欢事件驱动模型。

我不完全理解您代码的意图,因此我将尽我所能回答您的问题

1) 我建议你重温一下命名惯例。以大写字母开头的对象名称通常保留给类名,例如视图、活动、自定义类等。 因为我假设您的计数器是一个变量,所以我将其称为“计数器”而不是“计数器”

2) 如果您打算这样做,那么将循环放在主“线程”(我假设您指的是线程,而不是类)中实际上是可以的,但要小心,它会阻止主线程执行除执行特定循环之外的任何其他操作

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


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

这听起来是一个不错的选择。您在这里要做的不是通过
计数器+++
来更改变量,而是使用如下函数

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();
}
最后但并非最不重要的一点是,在
Main.java
中添加一个
notify()
函数,该函数在更新值时执行任何您想执行的操作

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

除了上面提到的所有内容之外,请确保变量声明为volatile。您的总体方法听起来有问题-一旦满足条件,让后台线程在ui线程上运行一些东西可能会更好,因此您可以避免阻塞ui线程。实际上我已经尝试过了,但我得到一个例外,我需要使用looper.prepare。这使得事情变得更加复杂。我想要的一个最好的解决方案是,我只有一个bool变量,当我点击图像时它会改变,并且以某种方式通知主类它已经改变了。然后你需要一个观察者模式。当变量更改时触发属性更改事件,并在需要时注册属性更改侦听器。