【问题标题】:mvvmcross app singleton lifecyclemvvmcross 应用程序单例生命周期
【发布时间】:2014-10-12 23:43:19
【问题描述】:

我在同一个应用中有一个服务(Foreground、STICKY)和一个活动(LaunchMode.SingleTask)。

有2个mvvmcross设置场景:

  1. 服务从开机启动,mvvmcross 使用 'setup.EnsureInitialized' 方法初始化
  2. 服务从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 容器无法解析信使。 => 它不能仅仅因为设置过程没有开始而解决。 它的行为就像应用程序已经初始化...

那么上一个崩溃服务中的上一个应用程序单例是否仍在某个地方?

我可以强制应用重新初始化吗?

我对这种奇怪的行为有点困惑......

【问题讨论】:

    标签: mvvmcross application-lifecycle


    【解决方案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 可能对用户显示为“暂停”。

    【讨论】:

    • 是的!就是这样:)。然而它有一些奇怪的地方:当应用程序在崩溃后重新启动时,它不会通过启动屏幕,而是直接进入崩溃前的最后一个视图......
    猜你喜欢
    • 2012-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 2013-06-23
    • 2015-01-03
    • 1970-01-01
    • 2011-06-02
    相关资源
    最近更新 更多