[英]Java Observer and Observable not working properly between applications
[英]Observable/Observer not working?
我尝试在我的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 Observable appObserver = new Observable();
with 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()
notifyObservers()
。 但问题是, setChanged()
受到保护,因此只对Observable的任何子类可见。
所以我想这并不意味着我试图使用它的方式,但下面的hackish子类将工作...
public class MyObservable extends Observable{
@Override
public boolean hasChanged() {
return true; //super.hasChanged();
}
}
BadCash的答案实际上对我不起作用,但我的问题确实源于Observable
的同样问题。 也许你正在使用较旧的实现,但我使用的是Java 8.而不是重写hasChanged()
,我必须重写notifyObservers()
以在通知之前始终将自己设置为更改 :
class WorkingObservable extends Observable{
@Override
public void notifyObservers(){
setChanged();
super.notifyObservers();
}
};
这对我有用。 我查看了源代码,似乎Observable
类没有在内部调用hasChanged()
方法来决定是否通知。 它只是检查changed
私有变量。 这可能可以更好地实施。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.