Observable/Observer不工作?

Mag*_*s W 8 java android observers observable observer-pattern

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

MyApplication.java

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

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

}
Run Code Online (Sandbox Code Playgroud)

Foo.java

MyApplication.appObserver.notifyObservers( "Hello world" );
Run Code Online (Sandbox Code Playgroud)

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
    }

}
Run Code Online (Sandbox Code Playgroud)

更重要的是,我试着涂鸦了一个简单的可观察我自己的,然后一切工作就像一个魅力与刚刚替换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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我错过了什么?

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

Mag*_*s W 17

看来我错过了观察员机制的重要组成部分,显然是一个必须调用setChanged()之前notifyObservers().但问题是,setChanged()受保护,因此只对Observable的任何子类可见.

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

public class MyObservable extends Observable{

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

}
Run Code Online (Sandbox Code Playgroud)


J-b*_*bob 8

BadCash的答案实际上对我不起作用,但是我的问题确实源于与的相同问题Observable。也许您使用的是较旧的实现,但是我使用的是Java8。除了重写之外hasChanged(),我还必须重写notifyObservers()以始终在通知之前将自身设置为可更改

class WorkingObservable extends Observable{
    @Override
    public void notifyObservers(){
        setChanged();
        super.notifyObservers();
    }
};
Run Code Online (Sandbox Code Playgroud)

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