Class 是 Observable 并实现了 Observer,但不会触发最后一个元素

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

我有 3 个 classes,Manager,MessageObserver,WidgetObserver

当我调用 testManager() 时,我触发了 MessageObserver 中的 update() 方法,但是 MessageObserver 中的 notifyObservers() 方法没有触发 WidgetObserver 中的 update() 方法。

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
    }
}

一个猜测是 Observer 列表为 null 所以请检查你是否注册了 Observer.In 你的代码观察者列表与 observable 不同。

Observable 中的逻辑

 if (!changed)
                return;
            arrLocal = obs.toArray();
            clearChanged();
        }

        for (int i = arrLocal.length-1; i>=0; i--)
            ((Observer)arrLocal[i]).update(this, arg);