我在我的应用程序中创建了一个服务,用于侦听来自GCM的推送通知。
在我测试过的所有场景中都会正确调用服务的OnMessage
方法:app在前台运行,app在后台运行,app不在运行。但是,当应用程序未运行时,当我尝试使用NullReferenceException
解析依赖项时,代码会抛出Mvx.Resolve
。
Unhandled Exception:
System.NullReferenceException: Object reference not set to an instance of an object
at Cirrious.CrossCore.Mvx.Resolve[IRepository] () [0x00000] in <filename unknown>:0
at MyApp.Android.Notifications.GcmService+<OnMessage>d__3.MoveNext () [0x00000] in <filename unknown>:0
Process my.app.droid (pid 7846) has died.
看来,由于应用程序未运行,Setup
类尚未执行,IoC容器不知道如何解析我的类型。或者,更糟糕的是,Mvx
类尚未初始化而且根本没有。
我似乎无法在网上找到有关如何解决此问题的文档。
我运气不好并且必须尝试使用通知中发送的信息启动我的应用程序,并且仅在应用程序完全启动后才在我的IRepository
上执行操作?
或者有没有办法确保在应用程序关闭时运行的服务被系统激活时Mvx
已正确初始化?当然,这是更好的选择,因为我可能会在其他后台服务中遇到这种情况,听取互联网访问更改或位置更改。
答案 0 :(得分:7)
Stuart Lodge的评论让我走上了正确的轨道并帮助我解决了我的问题,但我自己会详细回答这个问题,因为其他人可能会遇到同样的问题。
我在网上的不同文档中没有理解的是,MvvmCross Android应用程序是通过MvxAndroidSetupSingleton
初始化的。这种类型的方法,据我所知,可以安全地重复调用,以确保单例存在并正确初始化:
var setupSingleton = MvxAndroidSetupSingleton.EnsureSingletonAvailable(context);
setupSingleton.EnsureInitialized();
当我在通知服务上收到消息时,我只需要调用此代码:
protected async override void OnMessage(Context context, Intent intent)
{
var setupSingleton = MvxAndroidSetupSingleton.EnsureSingletonAvailable(context);
setupSingleton.EnsureInitialized();
await MyMobileApp.EnsureDataStoreInitialized();
var logger = Mvx.Resolve<ILogger>();
logger.Send(LogLevel.Info, "Notification received");
}
如果应用程序正在运行,它基本上是无操作,但如果应用程序已关闭,它将初始化MvvmCross运行Setup
类的方法等。
然后我借用了这个概念并在我的应用程序上实现了一个&#34;确保&#34; -type方法,该方法将执行我通常在启动画面中执行的部分初始化(主要是确保数据存储存在)
初始化MvxAndroidSetupSingleton
之后,我可以像往常一样解决依赖关系。