mvvmcross应用程序单例生命周期
我在同一个应用程序中有一个服务(前台、粘性)和一个活动(LaunchMode.SingleTask) 有两种mvvmcross设置方案:mvvmcross应用程序单例生命周期,mvvmcross,application-lifecycle,Mvvmcross,Application Lifecycle,我在同一个应用程序中有一个服务(前台、粘性)和一个活动(LaunchMode.SingleTask) 有两种mvvmcross设置方案: 服务从启动时启动,mvvmcross使用“setup.EnsureInitialized”方法初始化 服务从活动启动,mvvmcross以“经典”方式初始化 有时,由于内存压力低或意外异常,我的服务被终止或终止 然后我点击我的发射器 10-13 01:05:06.699 497 507 I ActivityManager: START {act=and
10-13 01:05:06.699 497 507 I ActivityManager: START {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=LoneWorker.Client.Android.App/loneworker.client.android.app.TrialSplashScreen bnds=[240,223][360,379] u=0} from pid 11747
10-13 01:05:06.769 497 7269 I ActivityManager: Start proc LoneWorker.Client.Android.App for activity LoneWorker.Client.Android.App/loneworker.clientandroid.app.views.HomeView: pid=11980 uid=10081 gids={3003, 1015, 1023, 1028}
但是,启动屏幕看起来不像是正常的应用程序启动,应用程序会立即失败
10-13 01:05:07.959 11980 11980 I MonoDroid: UNHANDLED EXCEPTION:
10-13 01:05:07.969 11980 11980 I MonoDroid: System.NullReferenceException: Object reference not set to an instance of an object
10-13 01:05:07.969 11980 11980 I MonoDroid: at Cirrious.CrossCore.Mvx.Resolve<Cirrious.MvvmCross.Plugins.Messenger.IMvxMessenger> () <0x00038>
10-13 01:05:07.969 11980 11980 I MonoDroid: at LoneWorker.ClientAndroid.App.Views.HomeView..ctor () <0x0002f>
10-13 01:05:07.969 11980 11980 I MonoDroid: at (wrapper dynamic-method) object.ee0d83da-1657-4884-bf34-4fc266ad42f0 (intptr,object[]) <0x0003f>
10-13 01:05:07.969 11980 11980 I MonoDroid: at Java.Interop.TypeManager.n_Activate (intptr,intptr,intptr,intptr,intptr,intptr) <0x00283>
10-13 01:05:07.969 11980 11980 I MonoDroid: at (wrapper dynamic-method) object.2fd07179-5f93-420a-8653-1fbe1c8a2f2e (intptr,intptr,intptr,intptr,intptr,intptr) <0x0006b>
10-13 01:05:07.959 11980 11980 I单机器人:未处理的异常:
10-13 01:05:07.969 11980 11980 I MonoDroid:System.NullReferenceException:对象引用未设置为对象的实例
10-13 01:05:07.969 11980 11980 I单机器人:在cirrium.CrossCore.Mvx.Resolve()
10-13 01:05:07.969 11980 11980 I单机器人:在LoneWorker.ClientAndroid.App.Views.HomeView..ctor()
10-13 01:05:07.969 11980 11980 I单机器人:at(包装器动态方法)对象。ee0d83da-1657-4884-bf34-4fc266ad42f0(intptr,对象[])
10-13 01:05:07.969 11980 11980 I MonoDroid:at Java.Interop.TypeManager.n_激活(intptr,intptr,intptr,intptr,intptr,intptr,intptr)
10-13 01:05:07.969 11980 11980 I单机器人:at(包装器动态方法)对象。2fd07179-5f93-420a-8653-1fbe1c8a2f2e(intptr,intptr,intptr,intptr,intptr,intptr,intptr)
在日志中,我只有一个异常,因为Mvx容器无法解析messenger。
=>由于安装过程未启动,因此无法解决此问题。
它的行为就像应用程序已经初始化
那么,以前崩溃的服务中的前一个应用程序singleton是否还在运行
我可以强制应用程序重新初始化吗
我对这种奇怪的行为感到有点困惑…堆栈跟踪显示您的应用程序是在一个“新”过程中创建的,但是通过
HomeView启动的
然后,代码在其构造函数中调用Mvx.Resolve
10-13 01:05:07.969 11980 11980 I MonoDroid: at Cirrious.CrossCore.Mvx.Resolve<Cirrious.MvvmCross.Plugins.Messenger.IMvxMessenger> () <0x00038>
10-13 01:05:07.969 11980 11980 I MonoDroid: at LoneWorker.ClientAndroid.App.Views.HomeView..ctor () <0x0002f>
10-13 01:05:07.969 11980 11980 I单机器人:在cirrial.CrossCore.Mvx.Resolve()
10-13 01:05:07.969 11980 11980 I单机器人:在LoneWorker.ClientAndroid.App.Views.HomeView..ctor()
该异常随后在内部产生:
public static object Resolve(Type serviceType)
{
var ioc = MvxSingleton<IMvxIoCProvider>.Instance;
return ioc.Resolve(serviceType);
}
公共静态对象解析(类型serviceType)
{
var ioc=MvxSingleton.Instance;
返回ioc.Resolve(serviceType);
}
这是因为MvxSingleton.Instance
为空()
由于Android的生命周期,MvvmCross不会在构建视图的过程中检查安装是否完成,而是在OnCreate
方法中检查
我建议您将代码从视图构造函数中移到OnCreate
——在base.OnCreate
调用之后的某个地方
请注意,在这些情况下-如果您在创建活动/视图期间在UI线程上运行Setup
,则UI可能会向用户显示为“暂停”。!就是这样:)。然而,它有一点奇怪:当应用程序在崩溃后重新启动时,它不会通过启动屏幕,而是直接进入崩溃前的最后一个视图。。。。