Mag*_*s W 8 java android observers observable observer-pattern
我尝试在我的Application子类中实现静态Observable,但它不起作用.没有异常或错误消息,但我的update()回调没有被调用.
MyApplication.java
public class MyApplication extends Application{
public static Observable appObserver = new Observable();
public void onCreate(){
super.onCreate();
}
}
Run Code Online (Sandbox Code Playgroud)
Foo.java
MyApplication.appObserver.notifyObservers( "Hello world" );
Run Code Online (Sandbox Code Playgroud)
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
}
}
Run Code Online (Sandbox Code Playgroud)
更重要的是,我试着涂鸦了一个简单的可观察我自己的,然后一切工作就像一个魅力与刚刚替换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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我错过了什么?
我正在使用Android 2.3.6的Nexus One进行测试,如果重要的话.
Mag*_*s W 17
看来我错过了观察员机制的重要组成部分,显然是一个必须调用setChanged()之前notifyObservers().但问题是,setChanged()受保护,因此只对Observable的任何子类可见.
所以我想这并不意味着我试图使用它的方式,但下面的hackish子类将工作...
public class MyObservable extends Observable{
@Override
public boolean hasChanged() {
return true; //super.hasChanged();
}
}
Run Code Online (Sandbox Code Playgroud)
BadCash的答案实际上对我不起作用,但是我的问题确实源于与的相同问题Observable。也许您使用的是较旧的实现,但是我使用的是Java8。除了重写之外hasChanged(),我还必须重写notifyObservers()以始终在通知之前将自身设置为可更改:
class WorkingObservable extends Observable{
@Override
public void notifyObservers(){
setChanged();
super.notifyObservers();
}
};
Run Code Online (Sandbox Code Playgroud)
那对我有用。我查看了源代码,似乎Observable该类没有在hasChanged()内部调用方法来决定是否通知。它只是检查changed私有变量。这可能可以更好地实现。
| 归档时间: |
|
| 查看次数: |
7050 次 |
| 最近记录: |