是否有任何方法可以监听全局变量的更改以触发事件

时间:2014-02-19 16:40:57

标签: java android

Android,Java。是否有任何方法可以监听全局变量的更改以触发事件

例如,如果我在一个类中创建一个名为 SeeMe 的全局布尔变量。然后从第二个类将该全局布尔值更改为 true

第一节课是否听过这个改变,然后执行 Tryme();

2 个答案:

答案 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),并且代理类的所有方法调用都将通过调用(....)。

这样的解决方案有一个很大的优势:您正在监控的类没有与监控框架耦合