2014-07-24 29 views
2

我在我的應用程序中創建了一個服務,用於偵聽來自GCM的推送通知。當應用程序關閉並收到通知時,MvvmCross如何在通知服務中初始化?

服務的OnMessage方法在我測試過的所有場景中被正確調用:應用程序在前臺運行,應用程序在後臺運行,應用程序未運行。但是,當應用程序未運行時,當我嘗試使用Mvx.Resolve解決依賴關係時,代碼將拋出NullReferenceException

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在應用程序關閉時運行的服務被系統激活時正確初始化?這當然是更好的選擇,因爲我可能會在其他後臺服務中遇到此問題,這些服務正在監聽Internet訪問更改或位置更改。

+0

像http://stackoverflow.com/questions/17466140/mvvmcross-initialization這樣的問題可能有幫助 – Stuart

回答

6

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類的方法等

我:在通知服務接收然後借用的概念和在我的應用程序上實現了一個「確保」類型的方法,該方法將執行我通常在我的啓動畫面中執行的部分初始化(主要是確保數據存儲存在)。

初始化了MvxAndroidSetupSingleton後,我可以照常解析依賴關係。

相關問題