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&lt;IMvxIoCProvider&gt;.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 应用程序单例生命周期的主要内容,如果未能解决你的问题,请参考以下文章

是否需要保存对单例objective-c 对象的引用才能在IOS 应用程序的整个生命周期中保留它?

Spring生命周期详解 + 应用实例

Spring生命周期详解 + 应用实例

视觉知识单例模式

单例模式(Singleton)

SimpleRepository 的生命周期管理