Java中的Observable无法正常工作?

时间:2011-11-23 22:54:38

标签: java android observer-pattern

好的,所以我之前使用过观察者的项目,并且我正在遵循完全相同的方法,但由于某种原因,我的观察者中的更新方法根本没有被调用。

在我的Android应用程序活动中:

public void newGame(View view)
{
    poleLeft.clear();
}

在我的Pole课程中:

public void clear()
{
    stack.clear();
    size = 0;
    head = 0;

    setChanged();
    notifyObservers();
}

在我的View类中:

private class PoleObserver implements Observer
{
    public void update(Observable observable, Object data)
    {
        postInvalidate();
    }
}

    leftPole.addObserver(new PoleObserver());

基本上我想做的就是在极点(poleLeft)上有一定数量的项目,清除它,并重新绘制应用程序视图以反映这些变化。但是,当我单击按钮时,Pole被清除,但视图没有改变,并且在update方法中放置System.out.println永远不会输出,因此它永远不会被运行。为什么会这样?

2 个答案:

答案 0 :(得分:0)

您是否正在执行无序操作?这个例子适合我。

import java.util.Observable;
import java.util.Observer;

public class Pole extends Observable {

    public void clear()
    {
        setChanged();
        notifyObservers();
    }

    public static class PoleObserver implements Observer
    {
        public void update(Observable observable, Object data)
        {
            System.out.println("Updated");
        }
    }

    public static void main(String[] args) {

        Pole p = new Pole();
        p.addObserver(new Pole.PoleObserver());
        p.clear();

    }

}

答案 1 :(得分:0)

您似乎没有在使用poleLeft的游戏构造函数和视图类leftPole中发布“真实”代码。没有一个小的,可运行的例子,我们可以帮助你。

(或者这种差异可能是问题的根源!)

一些建议:

  • 使用@override确保update方法确实按照您的想法实施interface。也许你导入的另一个Observer与你认为的那个有所不同。

  • 使用Log调用以确保您真正将观察者安装在您认为自己的同一个观察者身上。您可以通过将对象“identityHashCode打印到日志中来完成此操作。