在地图上显示(“移动”)标记的集合,表现

时间:2015-03-23 20:07:38

标签: android performance google-maps google-maps-markers google-maps-android-api-2

我从web api获取他们的位置和信息的飞机列表。我每隔几秒就调用一次这个web api并绘制地图标记(平面)来映射。

当我调用我的方法addPlanesToMap()时,要在地图上添加/更新标记,地图会在短时间内冻结。如果我在移动地图的同时添加/更新标记,则存在一些滞后。这种情况发生在像Nexus 5这样的设备中。地图中有大约200-300个标记。

有什么方法可以改进我的代码,做一些完全不同的事情吗?

HashMap<String, MarkerContainer> mMarkerHashMap = new HashMap <String, MarkerContainer>();

public void addPlanesToMap(List <? extends RealtimePlane > planes) {

    View planeMarkerView = getActivity().getLayoutInflater().inflate(R.layout.map_marker_plane, null);
    TextView markerShortCodeText = (TextView) planeMarkerView.findViewById(R.id.MapMarkerText);
    ImageView markerArrow = (ImageView) planeMarkerView.findViewById(R.id.MapMarkerArrow);

    for (RealtimePlane plane: planes) {
        MarkerContainer markerContainer = mMarkerHashMap.get(plane.getPlaneId());

        // Do not process, if not updated
        if (markerContainer != null && markerContainer.getPlane().getRecordedAtTime().equals(plane.getRecordedAtTime())) {
            continue;
        }

        markerShortCodeText.setText(plane.getPlaneCode());
        markerShortCodeText.setBackgroundResource(getMapMarkerDrawableBg(plane.getType()));
        markerArrow.setRotation((float) plane.getBearing());
        markerArrow.setVisibility(View.VISIBLE);


        // Add new plane marker to map
        if (markerContainer == null) {
            Marker m = mMap.addMarker(new MarkerOptions()
                .position(plane.getLocation())
                .flat(true)
                .anchor(0.5f, 0.5f)
                .title(plane.getLineCode())
                .icon(BitmapDescriptorFactory.fromBitmap(loadBitmapFromView(getActivity(), planeMarkerView))));

            mMarkerHashMap.put(plane.getPlaneId(), new MarkerContainer(m, plane));
        }

        // Marker already set, update
        else {
            markerContainer.getMarker().setIcon(BitmapDescriptorFactory.fromBitmap(loadBitmapFromView(getActivity(), planeMarkerView)));
            markerContainer.getMarker().setPosition(plane.getLocation());
            markerContainer.setPlane(plane);
        }
    }
}

1 个答案:

答案 0 :(得分:0)

  

有什么方法可以改进我的代码,做一些完全不同的事情

是的,不要绘制每个标记,只绘制可见区域内的标记。你也可以做标记聚类。

每隔几秒绘制2-300个标记并不是一个好主意