Android,Java。是否有任何方法可以监听全局变量的更改以触发事件
例如,如果我在一个类中创建一个名为 SeeMe 的全局布尔变量。然后从第二个类将该全局布尔值更改为 true 。
第一节课是否听过这个改变,然后执行 Tryme();
答案 0 :(得分:1)
您想使用Observer Pattern。
您将在全局对象中实现Observable接口,然后为需要接收通知的每个类实现Observer接口。
在您的情况下,持有seeMe
的变量将位于Observable
的类中,seeMe
的setter方法会在值更改时调用notify()
。方法tryMe()
将是Observer
类的成员,并且在update()
发生更改时会接到Observable
的调用。
以下是Observable
示例:
import java.util.Observable;
public class GlobalValues extends Observable {
private static GlobalValues mInstance = null;
public static GlobalValues getInstance() {
if( mInstance == null )
mInstance = new GlobalValues();
return mInstance;
}
public enum ValueName { NONE, SEEME, OTHERVALUE };
static class ValueKey {
private ValueName mValueName;
public ValueKey( ValueName valueName ) {
mValueName = valueName;
}
public ValueName getKey() { return mValueName; }
}
private boolean mSeeMe = false;
public boolean getSeeMe() { return mSeeMe; }
public void setSeeMe( boolean value ) {
if( value != mSeeMe ) {
mSeeMe = value;
this.setChanged();
this.notifyObservers( new ValueKey( ValueName.SEEME ) );
}
}
}
然后你会像这样使用它:
import java.util.Observable;
import java.util.Observer;
public class SampleObserver implements Observer {
public void startObservingGlobals() {
GlobalValues.getInstance().addObserver( this );
}
public void stopObservingGlobals() {
GlobalValues.getInstance().deleteObserver( this );
}
public void doTryMe( boolean newSeeMe ) {
// do something when seeMe changes
}
@Override
public void update(Observable observable, Object object) {
if( observable instanceof GlobalValues ) {
if( object != null && object instanceof GlobalValues.ValueKey ) {
switch( ( (GlobalValues.ValueKey)object ).getKey() ) {
case NONE:
// General Notification
break;
case SEEME:
doTryMe( GlobalValues.getInstance().getSeeMe() );
break;
case OTHERVALUE:
// do something else
break;
}
}
}
}
}
请注意,它还通过getInstance()
实现了一个全局单例模式,以及一种通过enum
和包装器类来识别哪个值已更改的方法。
答案 1 :(得分:0)
你无法在java中的变量上注册观察者 - 这是不可能的。我会研究方法 - 只为你的全局变量创建setter和getter。有两种可能性:
您必须为需要“监控”的每个类生成代理。此代理监视器只能有一个实现,您可以在多个类上注册它。例如,在JDK代理的情况下,您将实现方法invoke(Object proxy, Method m, Object[] args)
,并且代理类的所有方法调用都将通过调用(....)。
这样的解决方案有一个很大的优势:您正在监控的类没有与监控框架耦合