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

Google Maps添加新标记后旧标记无法移除问题求助

解决公交标记无法移除的问题

看起来你遇到的核心问题是旧标记残留,这主要是因为数据列表、标记集合没有及时清空,再加上两个独立定时器的时序冲突导致的。咱们一步步来修复:

问题分析

  1. 数据列表未清空:每次从服务器拉取数据时,name、lat这些列表没有被清空,导致旧数据一直累加,每次都会重复添加旧标记。
  2. 标记集合维护不当:添加新标记前没有清空markers集合,移除标记时的逻辑也有冗余(循环里多次调用map.clear())。
  3. 定时器时序冲突:你设置了每10秒添加标记,每9秒删除标记,这会导致删除操作可能在新标记添加前执行,或者删除不彻底,时序完全混乱。

修复方案

把删除标记的逻辑合并到获取数据的定时器里,每次拉取新数据前先清除旧标记和旧数据,这样逻辑更统一,也不会出现时序问题。

修改后的代码如下:

@Override 
public void onMapReady(final GoogleMap googleMap) { 
    map = googleMap; 
    map.getUiSettings().setMyLocationButtonEnabled(false); 
    map.setMyLocationEnabled(false); 

    // 初始化数据列表(如果没在别处初始化的话)
    name = new ArrayList<>();
    lat = new ArrayList<>();
    latlong = new ArrayList<>();
    time = new ArrayList<>();
    markers = new ArrayList<>();

    new Timer().scheduleAtFixedRate(new TimerTask() { 
        @Override 
        public void run() { 
            // 1. 先清空旧数据和旧标记
            getActivity().runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    map.clear(); // 清除地图上所有标记
                    markers.clear(); // 清空标记集合
                }
            });
            name.clear();
            lat.clear();
            latlong.clear();
            time.clear();

            Webi.with(getContext()) 
                .from("http://31.25.91.60:8888/GetResult.php") 
                .onResponse(new OnResponse() { 
                    @Override 
                    public void Response(String content, String s1) { 
                        try { 
                            JSONArray arr = new JSONArray(content); 
                            if(arr.length() > 0) { 
                                for (int i = 0; i < arr.length(); i++) { 
                                    JSONObject jobj = arr.getJSONObject(i); 
                                    name.add(jobj.getString("driverid")); 
                                    lat.add(jobj.getString("lat")); 
                                    latlong.add(jobj.getString("longlat")); 
                                    time.add(jobj.getString("time")); 
                                } 

                                getActivity().runOnUiThread(new Runnable() { 
                                    @Override 
                                    public void run() { 
                                        try { 
                                            for(int index = 0; index < name.size(); index++) { 
                                                LatLng point = new LatLng(
                                                    Double.parseDouble(lat.get(index)),
                                                    Double.parseDouble(latlong.get(index))
                                                ); 
                                                MarkerOptions markerOptions = new MarkerOptions() 
                                                    .position(point) 
                                                    .title(name.get(index)) 
                                                    .icon(BitmapDescriptorFactory.fromResource(R.drawable.bus_pin)); 
                                                Marker marker = map.addMarker(markerOptions); 
                                                markers.add(marker); 
                                            } 
                                        } catch (Exception e) { 
                                            e.printStackTrace(); 
                                        } 
                                    } 
                                }); 
                            } else { 
                                getActivity().runOnUiThread(new Runnable() {
                                    @Override
                                    public void run() {
                                        Toast.makeText(getActivity(), "چیزی پیدا نشد !", Toast.LENGTH_SHORT).show();
                                        map.clear();
                                        markers.clear();
                                    }
                                });
                            } 
                        } catch (Exception e) { 
                            getActivity().runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    map.clear();
                                    markers.clear();
                                }
                            });
                            e.printStackTrace(); 
                        } 
                    } 
                }).connect(); 
        } 
    }, 0, 10000); 

    LatLng university = new LatLng(36.2497511,58.8287331); 
    CameraPosition cameraPosition = new CameraPosition.Builder() 
        .target(university) 
        .zoom(17) 
        .bearing(90) 
        .tilt(40) 
        .build(); 
    map.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition)); 

    // 移除原来的runnable定时器,因为逻辑已经合并到上面的定时器里了
}

关键修改点

  • 合并定时器逻辑:删除了单独的9秒删除定时器,把清除操作放在每次拉取新数据前,确保旧标记被清除后再添加新的。
  • 清空数据列表:每次请求前清空name、lat等列表,避免旧数据累加导致重复添加标记。
  • 统一标记清除:使用map.clear()一次性清除所有标记,同时清空markers集合,避免残留旧的marker引用。
  • UI操作统一到主线程:所有涉及地图和Toast的操作都确保在主线程执行,避免线程安全问题。

这样修改后,每10秒会先清除所有旧标记和旧数据,然后拉取新数据添加新标记,就不会再出现旧标记残留的问题了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 03:28:08