You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

每5秒获取新LatLng后如何更新地图Marker而非重复新增?

解决地图Marker重复添加的问题

你遇到的问题很典型——每次广播接收到位置更新时,你都调用了map.addMarker(),这会每次都在地图上新增一个标记,而不是更新已有的那个。解决的核心思路是把Marker实例作为类的成员变量,只在第一次创建它,之后直接更新位置即可。

具体修改步骤:

  1. 在你的类(Activity/Fragment)中声明全局Marker变量
    把需要更新的标记(司机位置、目的地)定义为类的成员,这样就能在onReceive方法中复用实例:

    // 放在你的类里,不是LocationReceiver内部
    private Marker driverMarker; // 用于跟踪司机位置的标记
    private Marker dropMarker;   // 用于跟踪目的地的标记
    
  2. 修改LocationReceiver中的标记处理逻辑
    替换你原来的Marker创建代码,改成“先判断是否存在,不存在才创建,存在就更新位置”的逻辑:

    private class LocationReceiver extends BroadcastReceiver { 
        @Override 
        public void onReceive(Context context, Intent intent) { 
            // ... 你的其他获取位置数据的代码保持不变 ...
    
            driverLatLng = new LatLng(lat, longD);
            dropLatlong = new LatLng(latDest, longDest);
    
            // 处理目的地标记
            if (dropMarker == null) {
                // 第一次创建目的地标记
                dropMarker = map.addMarker(new MarkerOptions()
                        .icon(BitmapDescriptorFactory.fromResource(R.drawable.pin_green))
                        .position(dropLatlong));
            } else {
                // 直接更新已有标记的位置
                dropMarker.setPosition(dropLatlong);
            }
    
            // 处理司机位置标记
            if (driverMarker == null) {
                // 第一次创建司机标记
                MarkerOptions markerOptions = new MarkerOptions().position(driverLatLng);
                driverMarker = map.addMarker(markerOptions);
            } else {
                // 直接更新已有标记的位置
                driverMarker.setPosition(driverLatLng);
            }
    
            // ... 你的相机移动等其他代码保持不变 ...
        } 
    }
    

额外提示:

如果你的页面存在生命周期重建的情况(比如屏幕旋转),记得在onSaveInstanceState中保存标记的位置,或者在onMapReady回调里重新初始化标记,避免出现空指针异常。

内容的提问来源于stack exchange,提问作者bugfreerammohan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 23:28:11