gpt4 book ai didi

xamarin.android - MvvmCross-Android : How to perform App initialization on Main Thread

转载 作者:行者123 更新时间:2023-12-04 22:47:54 30 4
gpt4 key购买 nike

我有一个使用 MvvmCross 的 Android 应用程序。该应用程序通过 MvxSplashScreenActivity 作为主启动器启动,我提供了一个派生自 MvxAndroidSetup 的安装程序类。

然而,似乎我的 MvxAndroidSetup.CreateApp() 覆盖是在 ThreadPool 线程上调用的(参见 https://github.com/slodge/MvvmCross/blob/vnext/Cirrious/Cirrious.MvvmCross.Droid/Views/MvxBaseSplashScreenActivity.cs#L79 )。

确保我的应用程序初始化的某些部分在 MainThread 上执行的最佳方法是什么?

最佳答案

大多数现代平台 - WindowsStore、WindowsPhone 和 iOS - 允许您捆绑静态 Default.jpg (或类似的)在您的应用启动时娱乐您的用户。

Android 不这样做 - 它只是使用标记为 MainLauncher 的 Activity 启动您的应用程序。

如果您的应用程序需要做一些初始化工作(就像大多数 MvvmCross 应用程序一样),那么这让您有一个选择 - 您是在 UI 线程上进行这项工作(这会导致 UI 无响应)还是显示占位符 SplashScreen 和然后在后台线程上做初始化工作。

这就是 MvvmCross 试图让你做的事情

  • 它为您提供了一个闪屏类
  • 它覆盖了 OnCreate的初始屏幕,以在初始屏幕期间在 UI 线程上做最少的工作OnCreate (在此期间 UI 是黑色的,这太可怕了)
  • 然后它在线程池线程上执行大部分初始化 - 正如@CheeseBaron 在 MvxBaseSplashScreenActivity.cs#L79 上指出的那样

  • 大部分初始化——加载类型、启动服务、恢复设置、加载语言文件等——不需要在 UI 线程上完成。

    如果有初始化的某些部分你 需要在 UI 线程上执行,然后由您的应用程序决定如何以及何时将其编码回 UI - 例如
  • 通过使用 MvxMainThreadDispatcher.cs
  • 通过将该任务推迟到稍后的时间(例如,使用将由 View 模型创建触发的 Lazy IoC)
  • 通过覆盖 SplashScreen 的 OnInitialisationComplete方法

  • 但是,显然,您绝对不应该尝试将任何长期工作编码到 UI 线程上……UI 线程用于 UI,而不是用于繁重的计算或任何阻塞工作。

    您的目标应该是保持 UI 响应,即使在启动期间也是如此。

    详细说明:

    上述描述涵盖了应用程序的“正常启动”,例如安卓主页。

    但是,如果您深入研究,那么这不是启动应用程序的唯一方式 - 它也可以从推送通知、从被杀死(WP 语言中的“墓碑”)中恢复或从广播接收器之类的东西中启动。

    在这些情况下,MvvmCross 应用程序初始化可能会以上述以外的其他方式发生:
  • 在直接启动 MvxActivity 的情况下(例如从推送或从墓碑恢复后),则整个安装程序当前在该事件的 OnCreate 期间在 UI 线程上运行 - 这并不理想,我希望该框架将来可以改进。
  • 在后台服务启动的情况下,由应用工程师决定何时设置 - 例如见 Using MvvmCross from content providers and activities

  • 另一种启动途径的一个机会是继承 Android Application。对象 - 见 http://developer.android.com/reference/android/app/Application.html

    关于xamarin.android - MvvmCross-Android : How to perform App initialization on Main Thread,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16483178/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com