Google Maps添加新标记后旧标记无法移除问题求助
解决公交标记无法移除的问题
看起来你遇到的核心问题是旧标记残留,这主要是因为数据列表、标记集合没有及时清空,再加上两个独立定时器的时序冲突导致的。咱们一步步来修复:
问题分析
- 数据列表未清空:每次从服务器拉取数据时,
name、lat这些列表没有被清空,导致旧数据一直累加,每次都会重复添加旧标记。 - 标记集合维护不当:添加新标记前没有清空
markers集合,移除标记时的逻辑也有冗余(循环里多次调用map.clear())。 - 定时器时序冲突:你设置了每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
相关产品推荐
相关产品推荐

