我不想检查我的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
}
}
这是我的程序实际停止运行的地方。我无法想到任何其他方式来获取价值变化的指标。
感谢任何帮助,谢谢。
答案 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。