可观察的java对象不会更新

时间:2016-11-16 08:56:44

标签: java android observable

这是我的ActivityA:

public class ActivityA extends AppCompatActivity implement Observer
{

    private Mouse _mouse;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        ...

        _mouse = new Mouse();
        _mouse.posX = 30;
        _mouse.addObserver(this);


    }
    @Override
    public void onClick(View v)
    {
        Intent intent = new Intent(ActivityA.this, ActivityB.class);
        intent.putExtra("Mouse", Parcels.wrap(mouse));
        startActivity(intent)
    }

    @Override
    public void update(Observable o, Object arg)
    {
        // Never get called.
        Log.e("TAG", "We're updating the object");
    }
}

这是我的ActivityB:

public class ActivityB extends AppCompatActivity 
{
    private Mouse _mouse;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        ...

        _mouse = Parcels.unwrap(getIntent().getParcelableExtra("Mouse"));

        Log.v("AB", "X: "_mouse.posX); // This is 30
    }

    @Override
    public void onClick(View v)
    {
        _mouse.posX = 100;
        _mouse.NotifyObservers();

    }
}

最后我的模型看起来像这样:

public class Mouse extends Observable
{
    public int posX;

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

我无法让它发挥作用,因为"更新"在ActivityA中永远不会被调用。也许我忘了什么?在不使用活动结果代码的情况下,当从其他活动更新对象时,是否有更好的通知方式?

1 个答案:

答案 0 :(得分:1)

  • 首先需要注册您的观察者,在_mouse.addObserver(this);

  • 之后执行_mouse = new Mouse();来调用更新
  • 您使用Mouseparcelable模型Parcels wrap and unwrap做了第二件事。甚至你已经使用了serializable它没有用。

因为您已在Obervable扩展Mouse类注册了您的监听器,该类具有无法分发或可序列化的服务器列表。

因此,只要您将模型传递给ActivityB,就会删除ActivityA的旧听众。

要查看我的回答,请执行我已指明的第一步,并从_mouse.NotifyObservers();本身拨打ActivityA

您将在update上收到回电。