MvvmCross - Android:如何在主线程上执行应用程序初始化

时间:2013-05-10 13:14:59

标签: xamarin.android xamarin mvvmcross

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

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

确保在MainThread上执行App初始化的某些部分的最佳方法是什么?

1 个答案:

答案 0 :(得分:10)

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

Android不会这样做 - 只需使用标记为MainLauncher的活动启动您的应用。

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

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

  • 它为您提供了一个启动画面类
  • 它会覆盖启动画面的OnCreate,以便在启动画面OnCreate期间在UI线程上执行最小的工作(在此期间,UI是黑色的,这很糟糕)
  • 然后它在线程池线程上执行了大量的init - 正如@CheeseBaron在MvxBaseSplashScreenActivity.cs#L79指出的那样

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

如果您在UI线程上有需要进行初始化的某些部分,那么由您的应用决定如何以及何时将该工作封送回UI - 例如

但是,显然在任何时候你都不应该尝试将任何持久的工作编组到UI线程上...... UI线程用于UI,而不是用于繁重的计算或任何阻塞工作。

即使在启动过程中,您也应该保持用户界面的响应能力。


详细说明:

以上说明涵盖了应用程序的“正常启动”,例如: android主页。

然而,如果你深入了解,那么这不是应用程序启动的唯一方式 - 它也可以从推送通知,从被杀死的恢复(WP中的“逻辑删除”)或广播之类的东西开始接收机。

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

  • 在直接启动MvxActivity的情况下(例如从推送或从逻辑删除恢复后),然后整个安装程序当前在该活动的OnCreate期间在UI线程上运行 - 这是不理想的并且是某种东西我希望将来可以改进框架。
  • 在后台服务启动的情况下,由应用工程师决定何时设置 - 例如见Using MvvmCross from content providers and activities

替代启动路线的一个机会是继承Android Application对象 - 请参阅http://developer.android.com/reference/android/app/Application.html