分享

android – System.ArgumentException’jobject’不能是IntPtr.Zero.参数名称:jobject

 印度阿三17 2019-05-28

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

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

解决方法:

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

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

您看到此次崩溃是因为该应用可能已经落后,并且Android已触发了应用流程的集合.这导致大多数Java资源被Dalviks垃圾收集器破坏,但它们相应的.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 ();
});

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多