4

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

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

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

4

1 回答 1

10

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

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

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

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

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

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

如果您需要在 UI 线程上执行某些初始化部分,则由您的应用决定如何以及何时将这些工作编组回 UI - 例如

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

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


详细说明:

上述描述涵盖了从例如 android 主页“正常启动”应用程序。

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

在这些情况下,MvvmCross 应用程序初始化可能会以上述方式以外的其他方式发生:

  • 在直接启动 MvxActivity 的情况下(例如从推送或从墓碑恢复后),则整个安装程序当前在该活动的 OnCreate 期间在 UI 线程上运行 - 这并不理想,我希望该框架将来可以改进。
  • 在后台服务启动的情况下,由应用工程师决定何时设置 - 例如,请参阅从内容提供者和活动中使用 MvvmCross

另一种启动途径的一个机会是继承 AndroidApplication对象 - 请参阅http://developer.android.com/reference/android/app/Application.html

于 2013-05-10T13:53:03.777 回答