【问题标题】:Xamarin Android app built using MvvmCross stuck on splash screen when resumed from background after 3-4 days使用 MvvmCross 构建的 Xamarin Android 应用在 3-4 天后从后台恢复时卡在初始屏幕上
【发布时间】: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();
            }
        });
    }

【问题讨论】:

    标签: android xamarin mvvmcross


    【解决方案1】:

    我们对 MvvmCross 中的应用启动做了很多改进。因此,您的问题很可能已在较新的版本中得到解决。

    虽然,因为它说“没有可用的视图模型类型文件”,这可能意味着启动过程还没有完成或被卡在做某事并且找不到它想要继续的下一个视图模型。

    【讨论】:

    • 感谢您的快速评论。是的,这一定已经在较新的版本中得到修复。不幸的是,至少目前对我来说不可能升级到新版本。您对此有任何想法或建议,以了解为什么仅当应用程序在后台运行超过 3-4 天时才会发生这种情况。以正常方式,它工作得很好。另外,我无法调试,因为它是 MvvmCross 库代码的一部分。在不将应用程序长时间保持在后台的情况下重现此问题的任何建议。请提出建议。
    • 您可以通过 2 种方式强制收集应用程序的内存。首先是进入手机的开发者选项并启用“不保留活动”选项。这将确保后台中的每个活动都将被内存收集(如果您将整个应用程序放在后台,那么整个应用程序)。第二种方式,如果我没记错的话是真的安卓设备管理器,这里你也可以强制使用。
    • 这样做有一个问题,因为应用程序将被收集内存,调试连接将丢失。这使得调试变得非常困难,所以我建议放入很多 Console.WriteLine,这样你就可以看到你的 android 设备控制台中发生了什么。
    【解决方案2】:

    如果应用程序长时间处于后台或未使用,Android 将对其进行内存清除。这意味着 mvvm 框架丢失了它在内存中的所有引用,就像你的 IOC 容器一样。通常一个 mvvm 框架应该能够处理这个问题,但根据我的经验,有时你必须手动推动它。

    【讨论】:

    • 感谢您的评论。我们已经尝试过这种清除内存的方法,但问题没有重现。经过MvvmCross源码,我们发现MvxAndroidSetupSingleton->InitializeFromSplashScreen(IMvxAndroidSplashScreenActivity splashScreen)没有调用MvxAndroidSetUp->InitializeSecondary。
    • 正如我上面所说,我们可以通过评论来自 MvxAndroidSetupSingleton->InitializeFromSplashScreen() 的 InitializeSecondary() 调用和应用程序卡在启动画面上来重现此场景。请建议修复这个从应用程序级代码卡住的闪屏。基本上,我们不想修改 MvvmCross 代码,而是想从应用程序代码中修复。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-09
    • 1970-01-01
    • 1970-01-01
    • 2022-10-08
    • 2021-12-13
    • 1970-01-01
    相关资源
    最近更新 更多