2014-02-22 31 views
4

我试图在我的应用程序子类中实现静态Observable,但它不工作。没有例外或错误消息,但我的update()回调没有被调用。Observable/Observer无法正常工作?

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 
    } 

} 

什么更多的,我试着涂鸦了一个简单的可观察我自己的,然后一切工作像刚刚与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); 
     } 
    } 
} 

我缺少的是代public static Observable appObserver = new Observable();魅力?

我使用Android 2.3.6在Nexus One上测试它,如果它很重要的话。

回答

9

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

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

public class MyObservable extends Observable{ 

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

} 
1

BadCash的回答居然对我没有工作,但我的问题确实源自与Observable相同的问题。也许你使用的是老的实现,但我对Java的8而不是覆盖hasChanged(),我不得不重写notifyObservers()始终为自己是改变通知之前:

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

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