【发布时间】:2019-03-07 17:56:35
【问题描述】:
我正在开发一个使用 MvvmCross 3.5.1 版的 Xamarin Android 项目。我面临一个我们认为可能是由于 MvvmCross 设置失败的问题。应用程序基本上适用于Android和iOS平台。但是,我正面临一个专门针对 Android 的问题。应用程序已经很老了,并且在过去 3-4 年中一直在开发中,并且从未升级到 MvvmCross 的最新发布版本。更新 MvvmCross 是我的最后选择。但在此之前,我想通过了解它的根本原因和重现它的方法来解决这个问题。
场景:
1) 安卓设备上安装应用,登录完成。
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 服务
公共虚拟 void InitializeFromSplashScreen(IMvxAndroidSplashScreenActivity splashScreen) { 锁定(锁定对象) { _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();
}
});
}
【问题讨论】: