MvvmCross ViewModel 生命周期
MvvmCross ViewModel Life Cycle
根据我能查到的资料,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,即使我选中了该选项。 activity 似乎一直在后台徘徊。
也就是说,当我按下主页键时,它会调用 SaveStateToBundle。它似乎永远不会调用 ReloadFromBundle。这使得很难测试实际发生了什么。我担心的是,根据生命周期,如果应用程序确实从墓碑中恢复,它会在调用 ReloadFromBundle 之前调用 Init。由于 Init 是将参数传递给 ViewModel 的首选方式,因此只有使用参数来初始化数据才有意义。如果发生这种情况后,它调用ReloadFromBundle,它会覆盖Init中初始化的数据。这很好但效率很低。有没有办法在 Init 中知道 ViewModel 是由于新导航而创建的,还是正在从逻辑删除中恢复的?
感谢您对此的任何帮助。
吉姆
我与 ReloadFromBundle(IMvxBundle state)
有同样的问题,它从未被调用过。只有 "SaveState" 模式似乎有效。
不过我可以回答你的第二个问题:
您不应使用 Init
加载数据。您应该只使用它来传递要检索的数据的 ID。 "loading" 阶段应该发生在 Start
方法中。
根据我能查到的资料,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,即使我选中了该选项。 activity 似乎一直在后台徘徊。
也就是说,当我按下主页键时,它会调用 SaveStateToBundle。它似乎永远不会调用 ReloadFromBundle。这使得很难测试实际发生了什么。我担心的是,根据生命周期,如果应用程序确实从墓碑中恢复,它会在调用 ReloadFromBundle 之前调用 Init。由于 Init 是将参数传递给 ViewModel 的首选方式,因此只有使用参数来初始化数据才有意义。如果发生这种情况后,它调用ReloadFromBundle,它会覆盖Init中初始化的数据。这很好但效率很低。有没有办法在 Init 中知道 ViewModel 是由于新导航而创建的,还是正在从逻辑删除中恢复的?
感谢您对此的任何帮助。
吉姆
我与 ReloadFromBundle(IMvxBundle state)
有同样的问题,它从未被调用过。只有 "SaveState" 模式似乎有效。
不过我可以回答你的第二个问题:
您不应使用 Init
加载数据。您应该只使用它来传递要检索的数据的 ID。 "loading" 阶段应该发生在 Start
方法中。