我正在研究一个使用MvvmCross版本3.5.1的Xamarin Android项目。我遇到了一个我们认为可能是由于MvvmCross设置失败的问题。该应用程序基本上适用于Android和iOS两个平台。但是,我面临一个专门针对Android的问题。该应用程序非常老,并且在过去3-4年中一直在开发中,从未升级到MvvmCross的最新发行版本。对我来说,更新MvvmCross是最后的选择。但在此之前,我想通过了解其根本原因和重现此问题的方式来解决此问题。
场景:
1)在Android设备上安装了应用,登录完成。
2)应用程序移至后台。
3)3-4天后,通过单击应用启动器恢复应用 图标并停留在初始屏幕上。
4)应用程序在
再次开始工作
强制停止手机设置
如果没有在后台放置3-4天以上,则无法重现此问题。您能否建议一些方法来了解根本原因以及重现此问题的步骤,而无需将应用置于后台4天以上。
以下MvvmCross打印的日志和应用程序在启动屏幕上冻结。日志语句以粗体显示“没有可用的视图模型类型查找器-假设我们正在寻找初始屏幕-返回null”,将打印3-4次,然后将应用卡在初始屏幕上。即使应用卡在启动屏幕上。推送通知由应用程序接收。
设置:PlatformServices启动”
设置:MvvmCross设置开始”
设置:单例缓存开始”
“ mvx”:“没有可用的视图模型类型查找器-假设我们正在寻找启动画面-返回null”
“ mvx”:“没有可用的视图模型类型查找器-假设我们正在寻找初始屏幕-返回null”
“ mvx”:“没有可用的视图模型类型查找器-假设我们正在寻找启动画面-返回null”
请帮助我知道为什么上面的粗体语句被打印3-4次,为什么不打印_setup.InitializeSecondary()中的日志,然后应用程序在启动时卡住。看起来由于某些死锁或竞争条件,安装程序介于两者之间。如果您有任何建议来知道可能的根本原因以及重现此问题的方法,它将对我有很大帮助。预先感谢。
更新: 通过注释来自MvxAndroidSetupSingleton-> InitializeFromSplashScreen()的InitializeSecondary()调用,并将应用卡在启动屏幕上,我们可以重现此场景。请建议修复此应用程序代码卡住的启动屏幕。基本上,我们不想修改MvvmCross代码,而是想从应用程序代码中修复。感谢您的帮助。根据日志,不会执行MvxAndroidSetupSingleton.cs中以下方法中的代码行 _setup.InitializeSecondary(); 。仅在将应用程序在后台保留4-5天以上后,才会重现此问题。首先,我想知道为什么在这种情况下会发生这种情况,然后才解决。预先感谢
注意:我在应用程序中使用的是Android Foreground服务
公共虚拟无效InitializeFromSplashScreen(IMvxAndroidSplashScreenActivity splashScreen) { 锁(LockObject) { _currentSplashScreen = splashScreen;
if (_initializationStarted)
{
if (_initialized)
{
_currentSplashScreen.InitializationComplete();
return;
}
return;
}
_initializationStarted = true;
}
_setup.InitializePrimary();
ThreadPool.QueueUserWorkItem(ignored =>
{
_setup.InitializeSecondary();
lock (LockObject)
{
_initialized = true;
if (_currentSplashScreen != null)
_currentSplashScreen.InitializationComplete();
}
});
}
答案 0 :(得分:2)
我们对MvvmCross中的应用程序启动进行了很多改进。因此,您的问题很可能已在较新的版本中得到解决。
尽管,因为它说“没有可用的视图模型类型筛选器”,所以它可能意味着启动过程尚未完成或卡在做某事,并且找不到它想要继续的下一个ViewModel。
答案 1 :(得分:0)
如果应用程序在后台很长且未使用,则Android会将其清除。这意味着mvvm框架将丢失其所有引用(与IOC容器一样)。通常,mvvm框架应该能够处理此问题,但是根据我的经验,有时您必须手动推动它。