我收到一个错误,我无法理解:
我在void方法中有这个简单的警告对话框构建器
private void startAction() { AlertDialog.Builder builder; builder = new AlertDialog.Builder (this); var ad = builder.Create (); builder.SetMessage ("Some text"); builder.SetPositiveButton ("OK", delegate { ad.Dismiss (); ShowDialog (0); }); builder.SetNegativeButton ("Cancel", delegate { ad.Cancel (); }); builder.SetCancelable (true); builder.Show (); }
Xamarin Insights向我展示了一份我不能复制或理解的崩溃报告(多次).
System.ArgumentException'jobject' must not be IntPtr.Zero. Parameter name: jobject Raw Android.Runtime.JNIEnv.CallVoidMethod(IntPtr jobject, IntPtr jmethod) Android.App.Dialog.Dismiss() SpoonacularApp.Droid.ShoppingListActivity.c__AnonStorey3.<>m__0(object, DialogClickEventArgs) Android.Content.IDialogInterfaceOnClickListenerImplementor.OnClick(IDialogInterface dialog, int which) Android.Content.IDialogInterfaceOnClickListenerInvoker.n_OnClick_Landroid_content_DialogInterface_I(IntPtr jnienv, IntPtr native__this, IntPtr native_dialog, int which) at (wrapper dynamic-method) System.Object:ba5962df-899a-46fd-a4bd-6c9ffe426b75 (intptr,intptr,intptr,int)
这个例外谈论的是哪个论点?
我得到了相同的错误消息,Android.App.Dialog.Cancel()
而不是Android.App.Dialog.Dismiss()
.
该对等体连接为AlertDialog ad;
已被切断; 虽然该对象仍然可以在.NET中使用(通过点击处理程序),但它已经收集了Java对应物.这两个对象之间的绑定保存在存储IntPtr Handle
在.NET中实现的所有对象的属性中的全局引用中IJavaObject
.
发生跨VM收集周期时,将Handle
设置为IntPtr.Zero
并释放全局Java引用,以使Dalvik(Java)能够收集Java对象.
您看到此次崩溃是因为该应用可能已经落后,并且Android已触发应用流程的集合.这导致大多数Java资源被Dalviks垃圾收集器破坏,但它们相应的.NET对象仍处于活动状态,现在指向无效的Java对象.
解决此问题的方法是AlertDialog
使用以下代码片段检查两个点击处理程序中的对等连接:
public static class PeerConnectionHelper { public static bool HasPeerConnection(Java.Lang.Object jObj) { return !(jObj == null || jObj.Handle == System.IntPtr.Zero); } public static bool HasPeerConnection (Android.Runtime.IJavaObject jObj) { return !(jObj == null || jObj.Handle == System.IntPtr.Zero); } }
这将实现如下:
builder.SetPositiveButton ("OK", delegate { if (!PeerConnectionHelper.HasPeerConnection(ad)) { return; } ad.Dismiss (); ShowDialog (0); }); builder.SetNegativeButton ("Cancel", delegate { if (!PeerConnectionHelper.HasPeerConnection(ad)) { return; } ad.Cancel (); });
更多阅读:
Xamarin.Android GC Docs
对等连接崩溃的示例修复
Xamarin.Android内存管理陷入困境
讨论Xamarin.Android终结器和对等连接