【问题标题】:Observable/Observer not working?可观察/观察者不工作?
【发布时间】:2014-03-24 14:40:15
【问题描述】:

我尝试在我的 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 MyObservable appObserver = new MyObservable(); 替换 public static Observable appObserver = new Observable();,一切都像魅力一样发挥作用

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

【问题讨论】:

    标签: java android observer-pattern observable observers


    【解决方案1】:

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

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

    public class MyObservable extends Observable{
    
        @Override
        public boolean hasChanged() {
            return true; //super.hasChanged();
        }
    
    }
    

    【讨论】:

      【解决方案2】:

      BadCash 的回答实际上对我不起作用,但我的问题确实源于 Observable 的相同问题。也许您使用的是较旧的实现,但我使用的是 Java 8。我必须覆盖 notifyObservers(),而不是覆盖notifyObservers(),以便在通知之前始终将自己设置为更改: p>

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

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

      【讨论】:

      • 不要忘记覆盖 notifyObservers(Object arg),以防你想传递一个参数。
      猜你喜欢
      • 1970-01-01
      • 2011-04-14
      • 2013-01-30
      • 2017-12-04
      • 1970-01-01
      • 1970-01-01
      • 2011-06-17
      • 2011-06-09
      • 1970-01-01
      相关资源
      最近更新 更多