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

Joh*_*lph 4 xamarin.android mvvmcross xamarin

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

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

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

Stu*_*art 10

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

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

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

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

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

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

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

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

即使在启动期间,您也应该保持UI响应.


详细说明:

以上描述涵盖了来自例如android主页的应用程序的"正常启动".

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

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

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

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