每5秒获取新LatLng后如何更新地图Marker而非重复新增?
解决地图Marker重复添加的问题
你遇到的问题很典型——每次广播接收到位置更新时,你都调用了map.addMarker(),这会每次都在地图上新增一个标记,而不是更新已有的那个。解决的核心思路是把Marker实例作为类的成员变量,只在第一次创建它,之后直接更新位置即可。
具体修改步骤:
在你的类(Activity/Fragment)中声明全局Marker变量
把需要更新的标记(司机位置、目的地)定义为类的成员,这样就能在onReceive方法中复用实例:// 放在你的类里,不是LocationReceiver内部 private Marker driverMarker; // 用于跟踪司机位置的标记 private Marker dropMarker; // 用于跟踪目的地的标记修改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
相关产品推荐
相关产品推荐

