2017-02-15 131 views
0

我在Xamarin实施了谷歌地图窗体应用程序,但我得到的在导航离开页面之前,在地图完成加载当前位置之前,上述例外情况。[MissingMethodException:没有构造发现Xamarin.Forms.Maps.Android.MapRenderer ::构造函数(System.IntPtr,Android.Runtime.JniHandleOwnership)

这可能与先前提出的问题相同,但未回答here

从我的研究,我认为这个问题是关系到这个单独的问题给出漏abstration答案:MonoDroid: Error when calling constructor of custom view - TwoDScrollView

但是我没有Java或者Android开发的足够的知识,知道如何解决这个问题。我希望有人能够解释何时以及如何处理这种异常。基本上我相信我需要实现的是捕捉异常并在Droid项目中处理它,但是在哪里?

这些是我得到的关键异常消息。

消息:[NotSupportedException异常:无法激活从天然手柄0xbef7ad5c(key_handle 0xd4608e7)类型Xamarin.Forms.Maps.Android.MapRenderer的实例]

消息:[MissingMethodException:否构造找到Xamarin 。.Forms.Maps.Android.MapRenderer ::构造函数(System.IntPtr,Android.Runtime.JniHandleOwnership)]

的消息:类型的[异常 'Java.Interop.JavaLocationException' 被抛出]

回答

1

但是我没有足够的Java或Android开发知识来知道如何解决这个问题。我希望有人能够解释何时以及如何处理这种异常。

我想原因是当你浏览网页的Xamarin.Forms.Maps.Android.MapRendererDispose方法是在地图上其余的加载之前调用。 ACW需要创建MapRenderer的新实例,但未能创建新实例,因为MapRenderer没有构造方法(IntPtr, JniHandleOwnership)

如果你指的Premature Dispose() Calls你可以找到下面的语句:

如果子类中的确含有一种(IntPtr的,JniHandleOwnership)构造函数,那么该类型的新实例将被创建。

所以对于此异常的解决方法是创建一个子类(比方说MyMapRenderer)为Xamarin.Forms.Maps.Android.MapRenderer,其中有两个参数的构造函数:(IntPtr, JniHandleOwnership),并使用MyMapRenderer在地图渲染:

  1. 在PCL创建一个自定义控制Xamarin.Forms.Map.Map和替代项目中使用MyMap

    public class MyMap:Map{} 
    
  2. 创建自定义MapRenderer在Droid的项目,其中有一个(IntPtr, JniHandleOwnership)构造器:

    [assembly:ExportRenderer(typeof(MyMap),typeof(MyMapRenderer))] 
    namespace YourNameSpace.Droid 
    { 
        public class MyMapRenderer:MapRenderer 
        { 
         public MyMapRenderer(IntPtr handle, JniHandleOwnership transfer) { } 
        } 
    } 
    

有关创建自定义MapRenderer的详细信息,请参阅Custom a Map

+0

辉煌,谢谢 – JohnH

相关问题