mvvmcross 应用程序单例生命周期
Posted
技术标签:
【中文标题】mvvmcross 应用程序单例生命周期【英文标题】:mvvmcross app singleton lifecycle 【发布时间】:2014-10-12 23:43:19 【问题描述】:我在同一个应用中有一个服务(Foreground、STICKY)和一个活动(LaunchMode.SingleTask)。
有2个mvvmcross设置场景:
-
服务从开机启动,mvvmcross 使用 'setup.EnsureInitialized' 方法初始化
服务从Activity启动,mvvmcross以“经典”方式初始化
有时由于内存压力低或意外异常,我的服务被杀死或死亡。
然后点击我的启动器,
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>
在日志中我只有一个例外,因为 Mvx 容器无法解析信使。 => 它不能仅仅因为设置过程没有开始而解决。 它的行为就像应用程序已经初始化...
那么上一个崩溃服务中的上一个应用程序单例是否仍在某个地方?
我可以强制应用重新初始化吗?
我对这种奇怪的行为有点困惑......
【问题讨论】:
【参考方案1】:堆栈跟踪显示您的应用是在“新”进程中创建的,但正在通过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>
然后内部引发异常:
public static object Resolve(Type serviceType)
var ioc = MvxSingleton<IMvxIoCProvider>.Instance;
return ioc.Resolve(serviceType);
这是因为 MvxSingleton<IMvxIoCProvider>.Instance
为空 (https://github.com/MvvmCross/MvvmCross/blob/3.2/CrossCore/Cirrious.CrossCore/Mvx.cs#L36)
由于 Android 的生命周期,MvvmCross 不会在视图构建期间检查设置是否已完成 - 而是在 OnCreate
方法期间完成。
我建议您将代码移出 View 构造函数并移至 OnCreate
- 在 base.OnCreate
调用之后的某个位置。
请注意,在这些情况下 - 如果您在创建活动/视图期间在 UI 线程上运行 Setup
,则 UI 可能对用户显示为“暂停”。
【讨论】:
是的!就是这样:)。然而它有一些奇怪的地方:当应用程序在崩溃后重新启动时,它不会通过启动屏幕,而是直接进入崩溃前的最后一个视图......以上是关于mvvmcross 应用程序单例生命周期的主要内容,如果未能解决你的问题,请参考以下文章