![](/img/trans.png)
[英]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.