java - 可观察/观察者不工作?

标签 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 上进行测试。

最佳答案

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

所以我想它不应该以我尝试使用它的方式使用,但下面的 hackish 子类会起作用...

public class MyObservable extends Observable{

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

}

关于java - 可观察/观察者不工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21962276/

相关文章:

c++ - 实现信号(观察者模式): is mutable or const_cast necessary?

java - 如何在 Android 应用程序上保存 2 个字符串?

javascript - 如何在CQ中为节点开发自定义ACL

java - 我想在 Android 中解析 Google Map API 以进行反向地理编码

Java - 如何过滤日期列表?

kotlin - 数据绑定(bind)和 BaseObserver - Android MVVM

Android Studio - 跨多个设备的文本大小问题

java - Butterknife @generate 不工作{错误 :(23, 6) 错误:找不到符号类绑定(bind)}

安卓数据绑定(bind) : Is there a good way to show/hide an includes tag?

Java:可以通过观察者层次结构向观察者通知更改吗?