Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xamarin.android MvvmCross-Android:如何在主线程上执行应用程序初始化_Xamarin.android_Xamarin_Mvvmcross - Fatal编程技术网

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

Xamarin.android MvvmCross-Android:如何在主线程上执行应用程序初始化,xamarin.android,xamarin,mvvmcross,Xamarin.android,Xamarin,Mvvmcross,我有一个使用MvvmCross的Android应用程序。该应用程序通过作为主启动器的MvxSplashScreenActivity启动,我提供了一个从MvxAndroidSetup派生的安装类 然而,我的MvxAndroidSetup.CreateApp()覆盖似乎是在线程池线程上调用的(请参阅) 确保我的应用程序初始化的某些部分在主线程上执行的最佳方法是什么?大多数现代平台(WindowsStore、WindowsPhone和iOS)允许您捆绑一个静态默认值.jpg(或类似值),以在应用程序启

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

然而,我的MvxAndroidSetup.CreateApp()覆盖似乎是在线程池线程上调用的(请参阅)

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

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

Android不会这样做——它只是使用标记为MainLauncher的活动启动你的应用程序

如果你的应用程序需要做一些初始化工作(就像大多数MvvmCross应用程序一样),那么这就给了你一个选择——是在UI线程上做这些工作(这会导致UI没有响应),还是显示一个占位符屏幕,然后在后台线程上做初始化工作

这就是MvvmCross试图让您做到的

  • 它为您提供了一个splashscreen类
  • 它会覆盖splashscreen的
    OnCreate
    ,以便在splashscreen
    OnCreate
    期间在UI线程上做尽可能少的工作(在此期间,UI是黑色的,这很可怕)
  • 然后它在线程池线程上执行大部分init—正如@CheeseBaron在
大部分初始化——加载类型、启动服务、恢复设置、加载语言文件等——不需要在UI线程上完成

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

  • 利用
  • 将该任务推迟到以后执行(例如,使用将由viewmodel创建触发的惰性IoC)
  • 通过重写SplashScreen的方法
然而,显然,在任何时候都不应该尝试将任何持久的工作封送到UI线程上。。。UI线程用于UI,不用于繁重的计算或任何阻塞工作

您应该致力于保持UI的响应性,即使在启动期间也是如此


详细说明:

上述描述涵盖了android主页等应用程序的“正常启动”

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

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

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

另一种启动途径的一个机会是对Android
应用程序
对象进行子类化-请参见

在位置初始化的特定情况下,我经常使用我向IoC懒散注册的服务-我知道该服务将仅通过稍后的ViewModel构造在UI线程上创建-例如,请参见