我正在使用Xamarin.Android / Xamarin.iOS和MvvmCross来完成我当前的App项目。
当我的Android应用程序移动到后台时,我得到异常“当应用程序再次回到正面时,无法构造并初始化类型的ViewModel ......来自定位器MvxDefaultViewModelLocator”(附带截图)。但这并非每次都发生。似乎错误只发生在应用程序长时间处于后台模式且设备上打开了许多其他应用程序时。这与Androids内存管理有关吗?
感谢您的帮助。
修改 谢谢您的回答。这是内在的例外:
MvvmCross.Plattform.Exceptions.MvxException: 运行viewListViewModel类型的viewModel生命周期时遇到问题 - > System.Reflection.TargetInvocationException:抛出了异常 通过调用的目标 - > MvvmCross.Platfrom.Exceptions.MvxException:缺少文本提供程序 - 请使用合适的IMvxTextProvider初始化IoC MvvmCross.Localization.MvxLanguageBinder.get_TextProivder()...
所以我正在使用MvvmCross JsonLocalization插件。在启动时,我注册了我的textprovider:
TextProviderBuilder builder = new TextProviderBuilder(fileService.LocalizationDirectoryPath);
this.builder.LoadResources(cultureKey.Trim());
Mvx.RegisterSingleton<IMvxTextProvider(builder.TextProvider);
Mvx.RegisterSingleton<IMvxTextProviderBuilder>(builder);
并在我的ViewModel类中使用它:
public string GetText(string key)
{
string text = new MvxLanguageBinder(Constants.GeneralNamespace, "shared").GetText(key);
return text;
}
所以看起来Android内存管理器杀死了textprovider单例实例?
答案 0 :(得分:2)
是的,这必须与android内存管理有关。 如果打开了很多应用程序并且你的应用程序暂时没有使用,那么android会决定暂时保留它并释放分配的内存。
你检查了你的内部异常吗?可能会在ViewModel中重新初始化某些内容,但由于某些先决条件尚未完成,因此无法执行此操作。你基本上必须确保每个视图/视图模型都独立于其他视图/视图模型。
举个例子: 您在先前的视图模型中解析了某些内容,并在下一个视图模型中对其执行了一些操作。因为你以某种方式将它传递过来,所以你可以在第二个视图模型中使用它。但是,如果内存管理决定可以释放应用程序的内存,那么当您再次打开它时,它将会丢失。 所以你需要确保你的viewmodel导航回来,以其他方式检索丢失的数据等等......
正常情况下,MVVMCross负责处理大部分内容,但如果没有来自viewmodel的代码,则很难指出问题。