【问题标题】:MapFragment extremely slow and barely respondingMapFragment 极慢且几乎没有响应
【发布时间】:2016-04-13 14:25:08
【问题描述】:

我目前正在使用 Xamarin.Android 开发一个 android 应用程序。在这个应用程序中,我使用 DrawerLayout(来自 Support library v4)来显示我的应用程序内容和一个菜单,我可以通过按下工具栏中的按钮或向右滑动来打开它。

在抽屉的第一部分(页面内容),我有一个工具栏替换了经典的操作栏、一个搜索栏和我的 MapFragment。

在菜单部分,我有一个包含线性布局的滚动视图,它本身包含一些元素,如按钮、文本视图等,用户将使用它们来连接或注册。

菜单滑动顺畅,每个元素都正确响应,但地图片段显示地图确实有问题。几秒钟后,它会显示一个空网格,我必须点击片段才能加载地图的一些部分。几乎没有控件响应,有时双击会在等待很长时间后起作用,并且加载更精确的图块需要很长时间。

显然有些东西阻止了我的地图正确加载,但我不知道它是什么。

这是地图片段:

<fragment xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="@+id/mapFragment"
            android:layout_marginTop="94dp"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            class="com.google.android.gms.maps.MapFragment" />

这是我在活动文件中加载地图的方式(在 OnCreate 函数中):

MapFragment mapFrag = (MapFragment)FragmentManager.FindFragmentById(Resource.Id.mapFragment);
GoogleMap map = mapFrag.Map;
if(map != null)
{
    // The GoogleMap object is ready to go (well, should be)
}

我按照这个来创建我的地图片段:https://developer.xamarin.com/guides/android/platform_features/maps_and_location/maps/part_2_-_maps_api/

如果需要,我可以提供更多信息。我完全不知道这是从哪里来的。我在一个测试应用程序中使用了完全相同的代码(除了它是一个简单的线性布局,没有抽屉,也没有边距)并且它运行良好,这就是我感到困惑的原因。

编辑:让模拟器和我的手机在我写作时运行应用程序(至少花了我五分钟),但它仍然没有正确响应。在 Genymotion 模拟器 (API 16) 和我的 OnePlus One (API 21) 上测试,结果相同。

提前致谢。

【问题讨论】:

  • 您确定加载地图是导致挂断的原因吗?
  • 您有任何网络问题吗?假设您的应用程序没有造成阻塞问题,我会查看您的网络活动(通过 Charles、WireShark 等)以检查来自 Google 的 CDN 的响应时间。您手机上的 Google 地图应用和 Genymotion 可以吗?
  • 是的,我确定是地图造成的,因为虽然地图无法加载,但其他一切在应用程序中都运行良好。 @SushiHangover 这就是我在某个时候的想法,所以我检查了我的网络,这似乎工作正常。使用模拟器的光纤配置正确的 Wifi 网络,我的手机使用 LTE。我通过启动您可以使用我提供的 xamarin 链接制作的示例应用程序进行了仔细检查,并且地图正在顺利加载和响应。问题显然出在我的代码中,但我找到了一个神奇的解决方案:SupportMapFragment 而不是 MapFragment。

标签: android android-layout xamarin google-maps-api-2 mapfragment


【解决方案1】:

我不确定它究竟为什么“慢”,它必须处理和加载地图。

如果您使用抽屉布局,这意味着每个页面很可能已经是一个片段。这意味着您将在片段中有一个片段。当我在构建时为 MyDriving 示例功能实现此功能时,我在片段中使用了标准的 MapView 小部件,如果我在 Activity 中,我使用了 MapFragment

如果使用 MapView 小部件,您应该在片段中实现 IOnMapReadyCallback 以获得访问权限:

public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        base.OnCreateView(inflater, container, savedInstanceState);
        HasOptionsMenu = true;
        var view = inflater.Inflate(Resource.Layout.fragment_current_trip, null);

        mapView = view.FindViewById<MapView>(Resource.Id.map);
        mapView.OnCreate(savedInstanceState);
        return view;
    }

    public override void OnActivityCreated(Bundle savedInstanceState)
    {
        mapView.GetMapAsync(this);
        base.OnActivityCreated(savedInstanceState);
    }

    GoogleMap map;
    MapView mapView;


    public void OnMapReady(GoogleMap googleMap)
    {
        map = googleMap;
    }

需要注意的是,当您使用 MapView 小部件时,您还必须在使用后对其进行清理:

  #region MapView Lifecycle Events

    public override void OnResume()
    {
        base.OnResume();
        mapView?.OnResume();
    }

    public override void OnPause()
    {
        base.OnPause();
        mapView?.OnPause();
    }

    public override void OnDestroy()
    {
        base.OnDestroy();
        mapView?.OnDestroy();
    }

    public override void OnSaveInstanceState(Bundle outState)
    {
        base.OnSaveInstanceState(outState);
        mapView?.OnSaveInstanceState(outState);
    }

    public override void OnLowMemory()
    {
        base.OnLowMemory();
        mapView?.OnLowMemory();
    }

    #endregion

如果您在 Activity 中并使用 MapFragment,那么您也应该使用相同的样式,尽管不需要像 MapView 控件那样设置事件:

 GoogleMap map;
 SupportMapFragment mapFrag;

    public async void OnMapReady(GoogleMap googleMap)
    {
        map = googleMap;
    }

    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);
       //Set your layout

        mapFrag = (SupportMapFragment) SupportFragmentManager.FindFragmentById(Resource.Id.map);
        mapFrag.GetMapAsync(this);
    }

希望对你有帮助

【讨论】:

  • 我最初尝试使用您的 MapView 建议,但在实施时遇到了麻烦。所以我决定再次检查片段,但我注意到您使用的是 SupportMapFragment,而不是 MapFragment。所以我修改了我的代码,它运行良好!因此,对于任何可能遇到地图片段滞后问题的用户:SupportMapFragment 是奇迹解决方案!非常感谢!
猜你喜欢
  • 2017-08-09
  • 1970-01-01
  • 1970-01-01
  • 2015-10-16
  • 1970-01-01
  • 2020-10-10
  • 2021-08-19
  • 2019-10-13
  • 1970-01-01
相关资源
最近更新 更多