Observable / Observer不工作?

时间:2014-02-22 23:53:48

标签: java android observer-pattern observable observers

我尝试在我的Application子类中实现静态Observable,但它不起作用。没有异常或错误消息,但我的update()回调没有被调用。

MyApplication.java

public class MyApplication extends Application{
    public static Observable appObserver = new Observable();

    public void onCreate(){
        super.onCreate();        
    }

}

Foo.java

MyApplication.appObserver.notifyObservers( "Hello world" );

BarFragment.java

public class BarFragment extends Fragment implements Observer{

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);                
        MyApplication.appObserver.addObserver(this);
    }


    @Override
    public void onDestroy() {       
        MyApplication.appObserver.deleteObserver(this);
        super.onDestroy();
    }


    @Override
    public void update(Observable observable, Object data) {
        Log.i("BarFragment", data.toString()); // Should log, but doesn't
    }

}

更重要的是,我试着在我自己的一个简单的Observable上乱涂乱画,然后一切都像是一个魅力,用public static Observable appObserver = new Observable();代替public static MyObservable appObserver = new MyObservable();

MyObservable.java

public class MyObservable {
    protected List<Object> observers = new ArrayList<Object>();

    public void addObserver(Object observer){
        observers.add(observer);
    }

    public void notifyObservers(Object data){
        for( int i=0; i<observers.size(); i++ ){
            ((Observer) observers.get(i)).update(null, data);
        }
    }
}

我错过了什么?

如果重要的话,我正在使用Android 2.3.6的Nexus One进行测试。

2 个答案:

答案 0 :(得分:15)

似乎我错过了Observer机制的一个关键部分,显然必须在setChanged()之前调用notifyObservers()。但问题是,setChanged()受到保护,因此只对Observable的任何子类可见。

所以我想这并不意味着以我试图使用它的方式使用,但下面的hackish子类将起作用...

public class MyObservable extends Observable{

    @Override
    public boolean hasChanged() {
        return true; //super.hasChanged();
    }

}

答案 1 :(得分:5)

BadCash的答案实际上对我没有用,但我的问题确实源于Observable的同样问题。也许你正在使用一个较旧的实现,但我使用的是Java 8.而不是覆盖hasChanged(),我不得不覆盖notifyObservers()以始终将自己设置为已更改通知:

class WorkingObservable extends Observable{
    @Override
    public void notifyObservers(){
        setChanged();
        super.notifyObservers();
    }
};

这对我有用。我查看了源代码,似乎Observable类没有在内部调用hasChanged()方法来决定是否通知。它只检查changed私有变量。这可能可以更好地实施。