Android/Java:注意主类中的变量更改
我不想从我的主类中检查变量是否在我的xClass中更改。问题是,我的变量只有在单击ImageView并且该视图正在线程中运行时才会更改,所以当变量更改时,我不想在我的主类中检查while循环(我不知道这是否可能)。所以这就是我尝试的,但当我运行程序时,它只是停止,什么也不做Android/Java:注意主类中的变量更改,java,android,class,Java,Android,Class,我不想从我的主类中检查变量是否在我的xClass中更改。问题是,我的变量只有在单击ImageView并且该视图正在线程中运行时才会更改,所以当变量更改时,我不想在我的主类中检查while循环(我不知道这是否可能)。所以这就是我尝试的,但当我运行程序时,它只是停止,什么也不做 Thread setBack = new Thread() { public void run() { knight.setOnClickListener(new Vi
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变量,当我点击图像时它会改变,并且以某种方式通知主类它已经改变了。然后你需要一个观察者模式。当变量更改时触发属性更改事件,并在需要时注册属性更改侦听器。