【问题标题】:System.ArgumentException'jobject' must not be IntPtr.Zero. Parameter name: jobjectSystem.ArgumentException'jobject' 不得为 IntPtr.Zero。参数名称:作业
【发布时间】:2016-01-02 23:40:03
【问题描述】:

我收到一个我无法理解的错误:

我在 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.<startAction>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() 相同的错误消息。

【问题讨论】:

    标签: android xamarin


    【解决方案1】:

    AlertDialog ad;peer connection 已被切断;虽然该对象在 .NET 中仍然可用(通过单击处理程序),但它的 Java 对应对象已被收集。这两个对象之间的绑定保存在存储在 IntPtr Handle 属性中的全局引用中,用于 .NET 中实现 IJavaObject 的所有对象。

    当发生跨 VM 收集周期时,Handle 设置为 IntPtr.Zero 并释放全局 Java 引用以使 Dalvik (Java) 能够收集 Java 对象。

    您看到此崩溃是因为该应用可能已在后台运行,并且 Android 已在应用进程中触发了一个集合。这导致大多数 Java 资源被 Dalvik 垃圾收集器销毁,但它们对应的 .NET 对象仍然存在,现在指向无效的 Java 对象。

    解决此问题的方法是使用following code snippet 检查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 ();
    });
    

    更多阅读:

    【讨论】:

    • 哇,谢谢,我不会轻易找到这个,我很感激!
    猜你喜欢
    • 2014-12-26
    • 2023-03-15
    • 1970-01-01
    • 2018-02-04
    • 1970-01-01
    • 1970-01-01
    • 2020-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多