Search code examples
javaobservableobservers

Class is Observable and implements Observer, but is not triggering the last element


I have 3 classes, Manager, MessageObserver, WidgetObserver

  • Manager is an Observable class.
  • MessageObserver is both an Observer (for Manager) and is Observable itself.
  • WidgetObserver is an Observer (for MessageObserver).

When I call testManager(), I get the update() method in MessageObserver to trigger, but the notifyObservers() method inside of MessageObserver does NOT trigger the update() method in WidgetObserver.

public Manager extends Observable
{
    private ArrayList<Observer> observers = new ArrayList<>();
    public Manager()
    {
        // Set local variables
    }

    public void addObserver(Observer o)
    {
        observers.add(o);
    }

    public void newMessage(String a1, String a2)
    {
        this.a1 = a1;
        this.a2 = a2;
        setChanged();
        notifyObservers();
    }
}

public MessageObserver extends Observable implements Observer
{
    private ArrayList<Observer> observers = new ArrayList<>();

    public MessageObserver(Manager aManager)
    {
        mManager = aManager;
        mManager.addObserver(this);
        // set local variables from mManager.getValues()
    }

    public void update(Observable obj, Object arg)
    { 
        System.out.println("Triggered MessageObserver");
        ...
        setChanged();
        notifyObservers();
    }
}

public WidgetObserver implements Initializable, Observer
{

    public WidgetObserver()
    {
        mManager= new Manager();
        mMessageObserver = new MessageObserver(mManager);
        mMessageObserver.addObserver(this);
    }

    public void initialize()
    {
        // Establish local variables
        testManager();
    }

    private void testManager()
    {
        mManager.newMessage(...);
    }

    public void update(Observable obj, Object arg)
    {
         System.out.println("WIDGET TRIGGERED");
         // Add value to local array
    }
}

Solution

  • one guess will be list of Observer is null so please check you have register Observer.In your code observer list different from observable.

    Logic in Observable

     if (!changed)
                    return;
                arrLocal = obs.toArray();
                clearChanged();
            }
    
            for (int i = arrLocal.length-1; i>=0; i--)
                ((Observer)arrLocal[i]).update(this, arg);