MvvmCross ViewModel生命周期

时间:2015-03-31 15:31:39

标签: android xamarin xamarin.android mvvmcross

根据我能找到的信息,MvvmCross Viewmodel生命周期是

构建 - 使用IoC进行依赖注入

Init() - 导航参数的初始化

ReloadState() - 墓碑后的补液

Start() - 初始化和补液完成时调用

我已经实施了如下:

public async Task Init(Guid ID)
{
    await MPS_Mobile_Driver.Droid.DataModel.ShipmentDataSource.GetShipmentInventory(ID);
    ShipmentInventory = ShipmentDataSource.CurrInventory;

    ShipmentLots = await MPS_Mobile_Driver.Droid.DataModel.ShipmentDataSource.GetShipmentLotList((int)ShipmentInventory.idno, (short)ShipmentInventory.idsub);

    Inv_DamageList = await ListDataSource.GetInv_Damage();
}
protected override void SaveStateToBundle(IMvxBundle bundle)
{
    base.SaveStateToBundle(bundle);
    bundle.Data["ShipmentInventory"] = StringSerializer.SerializeObject(ShipmentInventory);
    bundle.Data["ShipmentLots"] = StringSerializer.SerializeObject(ShipmentLots);
    bundle.Data["Inv_DamageList"] = StringSerializer.SerializeObject(Inv_DamageList);
}

protected override void ReloadFromBundle(IMvxBundle state)
{
    base.ReloadFromBundle(state);
    ShipmentInventory = StringSerializer.DeserializeObject<ShipmentInventory>(state.Data["ShipmentInventory"]);
    ShipmentLots = StringSerializer.DeserializeObject<ShipmentLotList>(state.Data["ShipmentLots"]);
    Inv_DamageList = StringSerializer.DeserializeObject<Inv_DamageList>(state.Data["Inv_DamageList"]);
    state.Data.Clear();
}

首先,即使我选中了该选项,我也无法在我点击Home键时让模拟器实际销毁Activity。无论如何,活动似乎在后台徘徊。

话虽如此,当我点击主键时,它调用SaveStateToBundle。它似乎永远不会做的是调用ReloadFromBundle。这使得很难测试实际发生了什么。我担心的是,根据生命周期,如果应用程序确实从墓碑中恢复,它将在调用ReloadFromBundle之前调用Init。由于Init是将参数传递给ViewModel的首选方法,因此只有使用该参数初始化数据才有意义。如果在此之后,它调用ReloadFromBundle,它将覆盖在Init中初始化的数据。这很好但效率很低。有没有办法知道在Init中是否由于新的导航而创建了ViewModel,或者是否正在从墓碑中恢复?

感谢您提供任何帮助。

吉姆

1 个答案:

答案 0 :(得分:3)

我与ReloadFromBundle(IMvxBundle state)有同样的问题,它永远不会被调用。只有&#34; SaveState&#34;模式似乎有效。

我可以回答你的第二个问题:

您不应该使用Init来加载数据。您应该只使用它来传递要检索的数据ID。 &#34; loading&#34;阶段应该在Start方法中发生。