我有一个使用MvvmCross的Android应用程序。应用程序通过MvxSplashScreenActivity作为主启动器启动,我提供了一个从MvxAndroidSetup派生的安装程序类。
然而,似乎在ThreadPool线程上调用了我的MvxAndroidSetup.CreateApp()重写(参见https://github.com/slodge/MvvmCross/blob/vnext/Cirrious/Cirrious.MvvmCross.Droid/Views/MvxBaseSplashScreenActivity.cs#L79)。
确保在MainThread上执行App初始化的某些部分的最佳方法是什么?
答案 0 :(得分:10)
大多数现代平台--WindowsStore,WindowsPhone和iOS--允许您捆绑静态Default.jpg
(或类似)以在应用启动时娱乐您的用户。
Android不会这样做 - 只需使用标记为MainLauncher的活动启动您的应用。
如果您的应用程序需要进行一些初始化工作(就像大多数MvvmCross应用程序那样),那么这会让您做出选择 - 您是否在UI线程上执行该操作(然后导致无响应的UI)或者您是否显示占位符SplashScreen然后在后台线程上进行初始化工作。
这就是MvvmCross试图让你做的事情
OnCreate
,以便在启动画面OnCreate
期间在UI线程上执行最小的工作(在此期间,UI是黑色的,这很糟糕)大量的初始化 - 加载类型,启动服务,恢复设置,加载语言文件等 - 不需要在UI线程上完成。
如果您在UI线程上有需要进行初始化的某些部分,那么由您的应用决定如何以及何时将该工作封送回UI - 例如
但是,显然在任何时候你都不应该尝试将任何持久的工作编组到UI线程上...... UI线程用于UI,而不是用于繁重的计算或任何阻塞工作。
即使在启动过程中,您也应该保持用户界面的响应能力。
详细说明:
以上说明涵盖了应用程序的“正常启动”,例如: android主页。
然而,如果你深入了解,那么这不是应用程序启动的唯一方式 - 它也可以从推送通知,从被杀死的恢复(WP中的“逻辑删除”)或广播之类的东西开始接收机。
在这些情况下,MvvmCross应用程序初始化可能会以上述其他方式进行:
替代启动路线的一个机会是继承Android Application
对象 - 请参阅http://developer.android.com/reference/android/app/Application.html