2014-02-22 2 views
4

내 응용 프로그램 하위 클래스에서 정적 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 
    } 

} 

무엇이야 더, 나는 내 자신의 간단한 관찰 가능한을 낙서 시도하고 모든 것이 내가 놓친 게 무엇 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); 
     } 
    } 
} 

public static Observable appObserver = new Observable();을 대체와 매력처럼 일?

문제가있는 경우 Nexus One with Android 2.3.6에서 테스트하고 있습니다.

답변

9

Observer 메커니즘의 중요한 부분을 놓친 것처럼 보입니다. 분명히 을 notifyObservers() 앞에 호출해야합니다. 그러나 문제는 setChanged()이 보호되어 Observable의 하위 클래스에서만 볼 수 있습니다.

가 그래서 ... 내가 그것을 사용하려고 패션에 사용되는 것은 아닙니다,하지만 hackish 서브 클래스 아래 작동합니다 생각

public class MyObservable extends Observable{ 

    @Override 
    public boolean hasChanged() { 
     return true; //super.hasChanged(); 
    } 

} 
1

BadCash의 대답 실제로 나를 위해 작동하지 않았지만, 내 문제는 Observable 같은 문제에서 비롯되었습니다. 아마 당신은 이전 구현을 사용하고,하지만 난 오히려 hasChanged()을 무시보다 자바 8. 해요, 난 항상 가 통지하기 전에을 변경할 수 자체를 설정하는 notifyObservers()을 무시했다 : 속임수를 썼는지

class WorkingObservable extends Observable{ 
    @Override 
    public void notifyObservers(){ 
     setChanged(); 
     super.notifyObservers(); 
    } 
}; 

나를 위해. 소스 코드를 살펴보면 Observable 클래스가 내부적으로 hasChanged() 메서드를 호출하여 알림 여부를 결정하지 못하는 것으로 보입니다. 그냥 changed 개인 변수를 확인합니다. 이것은 아마도 더 잘 구현되었을 수 있습니다.

관련 문제