【问题标题】:google maps markers is not being removed after adding new添加新标记后,谷歌地图标记不会被删除
【发布时间】:2018-10-24 07:22:12
【问题描述】:

我目前正在开发一个向学生显示公交车位置的应用程序!
问题是当我从地图中删除带有marker.remove();map.clear(); 的标记并检索新位置并将其显示在地图上时,旧位置仍然显示。
这是我的代码:

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

    new Timer().scheduleAtFixedRate(new TimerTask() {
      @Override
      public void run() {
        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"));
                  }

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

  private Runnable runnable = new Runnable() {
    @Override
    public void run() {
      try {
        for(int index = 0; index < markers.size(); index++) {
          marker = markers.get(index);
          marker.remove();
          map.clear();
        }
      } catch (Exception e) {
        e.printStackTrace();
      }
      handler.postDelayed(this, 9000);
    }
  };

每 10 秒从服务器获取一次日期,并且每 9 秒标记必须被删除

【问题讨论】:

  • map.animateCamera之前尝试markers.clear();& map.clear()
  • @Eminem 没有任何区别
  • 在此行之前marker = map.addMarker(markerOptions); 致电map.clear();
  • @Eminem 您正在谈论的代码在 for 循环中,如果我有多个标记,那么它将只显示一个
  • 这样有效吗?

标签: java android google-maps google-maps-markers


【解决方案1】:

尝试将您的 map.clear() 和整个 for 循环移动到 UI 线程 Runnable 中。我认为您总是希望在添加新标记之前清除地图。否则,您将在同步这两个操作时遇到问题。例如,在 2 次运行后,标记将在 18 秒时移除,然后直到 20 秒才添加。

另外,我看不到您在哪里清除数据列表,您是在添加新的响应数据之前这样做吗?

getActivity().runOnUiThread(new Runnable() {
    @Override
    public void run() {
        map.clear();
        for(int index = 0; index < name.size(); index++) {
            try {
                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 = map.addMarker(markerOptions);
                markers.add(marker);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
});

【讨论】:

  • 我之前试过这段代码但没有得到答案(我的代码在onMapReady() =&gt; Timer =&gt; TimerTask 里面,它总是每10秒运行一次任务,我认为这些方法可能有问题)
  • 您是否在添加新回复之前清除了您的回复数据?
  • 是否参考此代码:markers.add(marker)?不,我不清除此列表,因为我用它来确定总标记但是当使用 map.clear() 通常它应该清除所有地图但它没有这样做
  • 不,我的意思是名称、纬度、纬度等列表。如果您只添加新数据而不删除旧数据,您还将在 for 循环中重新添加旧标记。
  • 天啊!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!我一直在为此努力编码一个星期,但这对我来说很奇怪,我认为这是谷歌地图的问题,但是......谢谢兄弟,你是真正的救星:D
猜你喜欢
  • 2019-03-07
  • 2012-10-17
  • 1970-01-01
  • 2015-01-30
  • 1970-01-01
  • 2015-03-14
  • 2018-10-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多