簡體   English   中英

重新啟動應用程序時,MXDialogActivityView.OnCreate()中的MonoCross:KeyNotFoundException

[英]MonoCross: KeyNotFoundException in MXDialogActivityView.OnCreate() when re-starting application

我一直在使用Xamarin的Android版Mono和MonoCross框架來開發應用程序,該應用程序目前在Android(2.3、4.0和其他版本)下運行。 在我的應用程序中,我有一個主要活動,用戶可以從中開始新活動,然后再開始其他活動,依此類推。 (例如Main-> A-> B-> C)

有時,我會遇到以下問題:當應用程序暫停(或停止)一段時間(即不在前台)和/或啟動了其他消耗內存的應用程序,然后又返回到我的應用程序時,無法正確重啟。 就是說,我可以看到活動C(窗口標題)的一部分持續幾秒鍾,然后C消失,B出現,以此類推,A和Main依此類推。 Main消失后,我回到主屏幕。 當我再次啟動我的應用程序時,它將以Main活動啟動。

在logcat中,我看到以下條目(希望我不要刪得太多):

05-15 14:36:39.732 I/ActivityManager(  598): START {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=de.branchare.adwais2013/branchware.adwais.droid.MainActivity u=0} from pid 1349
...
05-15 14:36:39.792 I/ActivityManager(  598): Start proc de.branchare.adwais2013 for activity de.branchare.adwais2013/branchware.adwais.droid.views.ActivityC: pid=29032 uid=10025 gids={3003, 1015, 1028}
...
05-15 14:36:39.952 I/ActivityThread(29032): Pub de.branchare.adwais2013.mono.MonoRuntimeProvider.__mono_init__: mono.MonoRuntimeProvider
...
05-15 14:36:42.966 I/MonoDroid(29032): at MonoCross.Droid.MXDialogActivityView`1<Branchware.Adwais.ModelContainer`1<Branchware.Adwais.Model.Visit>>.OnCreate (Android.OS.Bundle) <0x00053>
05-15 14:36:42.966 I/MonoDroid(29032): at Android.App.Activity.n_OnCreate_Landroid_os_Bundle_ (intptr,intptr,intptr) <0x00057>
05-15 14:36:42.966 I/MonoDroid(29032): at (wrapper dynamic-method) object.15bfff07-188b-4aff-a34f-ab878a2a545f (intptr,intptr,intptr) <0x00043>
05-15 14:36:43.036 E/mono    (29032):
05-15 14:36:43.036 E/mono    (29032): Unhandled Exception:
05-15 14:36:43.036 E/mono    (29032): System.Collections.Generic.KeyNotFoundException: The given key was not present in the dictionary.
05-15 14:36:43.036 E/mono    (29032):   at System.Collections.Generic.Dictionary`2[System.Type,System.Object].get_Item (System.Type key) [0x00000] in <filename unknown>:0
05-15 14:36:43.036 E/mono    (29032):   at MonoCross.Droid.MXDialogActivityView`1[Branchware.Adwais.ModelContainer`1[Branchware.Adwais.Model.Visit]].OnCreate (Android.OS.Bundle bundle) [0x00000] in <filename unknown>:0
05-15 14:36:43.036 E/mono    (29032):   at Android.App.Activity.n_OnCreate_Landroid_os_Bundle_ (IntPtr jnienv, IntPtr native__this, IntPtr native_savedInstanceState) [0x00000] in <filename unknown>:0
05-15 14:36:43.036 E/mono    (29032):   at (wrapper dynamic-method) object:15bfff07-188b-4aff-a34f-ab878a2a545f (intptr,intptr,intptr)
05-15 14:36:43.036 I/mono    (29032): [ERROR] FATAL UNHANDLED EXCEPTION: System.Collections.Generic.KeyNotFoundException: The given key was not present in the dictionary.
05-15 14:36:43.036 I/mono    (29032):   at System.Collections.Generic.Dictionary`2[System.Type,System.Object].get_Item (System.Type key) [0x00000] in <filename unknown>:0
05-15 14:36:43.036 I/mono    (29032):   at MonoCross.Droid.MXDialogActivityView`1[Branchware.Adwais.ModelContainer`1[Branchware.Adwais.Model.Visit]].OnCreate (Android.OS.Bundle bundle) [0x00000] in <filename unknown>:0
05-15 14:36:43.036 I/mono    (29032):   at Android.App.Activity.n_OnCreate_Landroid_os_Bundle_ (IntPtr jnienv, IntPtr native__this, IntPtr native_savedInstanceState) [0x00000] in <filename unknown>:0
05-15 14:36:43.036 I/mono    (29032):   at (wrapper dynamic-method) object:15bfff07-188b-4aff-a34f-ab878a2a545f (intptr,intptr,intptr)
05-15 14:36:43.136 I/ActivityManager(  598): Recipient 29032
05-15 14:36:43.136 I/ActivityManager(  598): Process de.branchare.adwais2013 (pid 29032) has died.
05-15 14:36:43.136 D/InputManager(  598): setFocusedApplication Exception: java.lang.NullPointerException
...
05-15 14:36:43.136 W/ActivityManager(  598): Force removing ActivityRecord{41cc9df0 de.branchare.adwais2013/branchware.adwais.droid.views.ActivityC}: app died, no saved state
...
05-15 14:36:43.166 I/ActivityManager(  598): Start proc de.branchare.adwais2013 for activity de.branchare.adwais2013/branchware.adwais.droid.views.ActivityB: pid=29052 uid=10025 gids={3003, 1015, 1028}

在我看來
-Android在活動暫停時銷毀了我的活動(我知道這是正確的行為)
-然后,當用戶返回我的應用程序時,Android會嘗試創建()新的活動實例(也是正確的)
-在框架的MXDialogActivityView.OnCreate()中,MonoCross嘗試在調用Render()之前從MXDroidContainer中獲取模型:

// fetch the model before rendering!!!  
Model = (T)MXDroidContainer.ViewModels[typeof(T)];  
// render the model within the view  
Render();  

-這是拋出KeyNotFoundException的地方(從不調用Render()方法),因為MXDroidContainer不再包含ViewModel。 (此實例可能也在此期間重新創建,因此不包含任何數據。)

我知道Android可以(甚至必須)銷毀已暫停/已停止的應用程序。 但是看到我的應用返回整個活動堆棧然后完全消失,然后不得不重新啟動它,這真是令人討厭。

我想要實現的是:
a)我的應用程序應在停止的位置(在活動C中)重新啟動。
如果不可能的話
b)我的應用程序應該在MainLauncher(活動Main)中重新啟動,並完全重新初始化。

我已經閱讀(並玩過)很多有關活動生命周期,啟動模式,AlwaysRetainTaskState等的信息,但是我還沒有找到解決問題的方法。

任何幫助或指針將不勝感激。

TIA,曼弗雷德。

我認為您對Activity生命周期及其與MonoCross框架的交互的分析是正確的。

我不確定MonoCross目前是否對這種“墓碑化”有任何處理-因此,如果您要處理此問題,則需要自己進行。

為此,您需要:

  • 使用protected override void OnSaveInstanceState(Bundle outState)方法將視圖的任何當前Model數據保存/序列化到Bundle中
  • 覆蓋默認的MX*ActivityView.OnCreate行為,以便使用將包含已保存實例狀態的bundle參數。

我最近在MvvmCross中完成了相同類型的操作。 但是,模型的生命周期在MvvmCross中是非常不同的-我相信MonoCross總是在內存中始終保留每個模型的一個實例,而MvvmCross只是將每個View鏈接到其ViewModel-因此ViewModel生命周期與View生命周期緊密地聯系在一起。 因此,我擔心Mvx代碼可能無法輕松移植回MX ...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM