根据我能找到的信息,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,或者是否正在从墓碑中恢复?
感谢您提供任何帮助。
吉姆
答案 0 :(得分:3)
我与ReloadFromBundle(IMvxBundle state)
有同样的问题,它永远不会被调用。只有&#34; SaveState&#34;模式似乎有效。
我可以回答你的第二个问题:
您不应该使用Init
来加载数据。您应该只使用它来传递要检索的数据ID。 &#34; loading&#34;阶段应该在Start
方法中发生。