簡體   English   中英

Observable / Observer不工作?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM