我尝试在我的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进行测试。
答案 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
私有变量。这可能可以更好地实施。