每1分钟Gps LatLong从服务器显示在地图中作为标记。但Marker获得重复

时间:2016-07-09 12:04:20

标签: android google-maps gps google-maps-android-api-2

1.在我的应用中 Gps LatLong 从服务器每个OneMinute获取。保存在共享首页中,然后获取 LatLong 来自共享首页显示地图上的标记

2.每一分钟我想根据LatLong移动标记。

3.但在更改标记位置时。获得重复

请帮我解决这个问题。

Oncreate 方法内部,我每隔60秒调用一次代码段,以便调用方法。

 try
        {
            Thread t = new Thread()
            {
                @Override
                public void run()
                {
                    try
                    {
                        while (!isInterrupted())
                        {
                            Thread.sleep(60*1000);
                            getActivity().runOnUiThread(new Runnable()
                            {
                                @Override
                                public void run()
                                {

                                    display_Location();
                                    Log.i("Every 60 Second","Current  Called..");

                                }
                            });
                        }
                    } catch (Exception e)
                    {
                        e.printStackTrace();
                    }
                }
            };
            t.start();

        }
        catch (Exception e)
        {
            e.printStackTrace();
        }

方法Iam使用:

private void display_Location()
    {

        try
        {

            mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);

            if (mLastLocation != null)
            {
        /*For Current Location ping Starts Here*/

                // get user data from session
                HashMap<String, String> user = session.getGPSPING();

                // UserLat
                String LatLongUser = "";
                LatLongUser = user.get(SessionManagerFor_Register.KEY_LATLONG);




                if (!LatLongUser.equals("") || LatLongUser != null)
                {

                    Log.i(" PING on MAP LatLong", LatLongUser);

                    String[] LanlongArr = LatLongUser.split("//");
                    List<String> Lanlonglist1 = Arrays.asList(LanlongArr);



                    int length = Lanlonglist1.size();

/*ArrayList For adding All ArrayList items in Single(Concating)*/


                    arraylist_DetailLineWalker = new ArrayList<String>(length);

                    for (int i = 0; i < length; i++) {


                        arraylist_DetailLineWalker.add(Lanlonglist1.get(i) 
                              );
                    }

                    if (arraylist_DetailLineWalker != null)
                    {

                        // Initializing
                        LineWalkermMarkers_arr = new ArrayList<Marker>();
                        //   just Remove Older Line Wlaker
                        if (LineWalkermMarkers_arr != null) {
                            // LineWalker_marker1.remove();
                            RemoveLineWalkerMarkers();

                            Log.i(TAG, "LineWalker REMOVED.............................");
                        }


                        for (int i = 0; i < arraylist_DetailLineWalker.size(); i++)
                        {
                            try 
                            {
                                String Val = arraylist_DetailLineWalker.get(i).toString();
                                //Log.i(" Validation Id",Val);
                                VALUE_ARRAY_STRING = Val.toString().split("::");

                                LatLong_DataSaveTable = VALUE_ARRAY_STRING[0].toString();



                                System.out.println("checking STarted LatLong::" + LatLong_DataSaveTable);

                                String[] latlong = LatLong_DataSaveTable.split(",");
                                double latitude1 = Double.parseDouble(latlong[0]);
                                double longitude2 = Double.parseDouble(latlong[1]);

                                //To hold location
                                LatLng latLng1 = new LatLng(latitude1, longitude2);
                                //To create marker in map
                                MarkerOptions markerOptionsLineWalker = new MarkerOptions();
                                markerOptionsLineWalker.position(latLng1); //setting position
                                markerOptionsLineWalker.draggable(true); //Making the marker draggable
                                markerOptionsLineWalker.title("USER LOCAITON");




                                    markerOptionsLineWalker.icon(BitmapDescriptorFactory.fromResource(R.drawable.walker_outof_fence_icon_red));



                                //adding marker to the map
                                // googleMap.addMarker(markerOptionsLineWalker);
                                LineWalker_marker1 = googleMap.addMarker(markerOptionsLineWalker);

                                LineWalkermMarkers_arr.add(LineWalker_marker1);
                                // LineWalker_marker1.setPosition(latLng1);
                                Log.i(TAG, " NEW Line Walkers PING Added.............................");

                            } catch (NumberFormatException e) {
                                e.printStackTrace();
                            }

                        }

                    } else {
                        Log.i("MAP NEwLatLong", "TOTAL ARRY LIST NULLL");
                    }


                }
                else
                {
                    Log.i("MAP NEwLatLong", "Null Not LatLong");

                    Toast.makeText(getActivity(), "Lat Long Not Available..!", Toast.LENGTH_SHORT).show();
                }


            }
            else
            {

                Log.i("Location EXception", "Couldn't get the location. Make sure location is enabled on the device");
                // can't get location
                // GPS or Network is not enabled
                // Ask user to enable GPS/network in settings
                gps.showSettingsAlert();
            }
        }
        catch (Exception ex)
        {
            ex.printStackTrace();
        }

    }


    /*Remove the Linewalker*/
    private void RemoveLineWalkerMarkers()
    {
        for (Marker marker: LineWalkermMarkers_arr)
        {
            marker.remove();
        }
        LineWalkermMarkers_arr.clear();
    }

3 个答案:

答案 0 :(得分:3)

if(arraylist_DetailLineWalker != null && arraylist_DetailLineWalker.size()>0){
    arraylist_DetailLineWalker.clear()
    mMap.clear();
    showMarker();
}

答案 1 :(得分:2)

在初始化RemoveLineWalkerMarkers() LineWalkermMarkers_arr之后,您正在致电LineWalkermMarkers_arr = new ArrayList<Marker>();,因此您永远不会移除您的标记。

删除标记后,只需初始化LineWalkermMarkers_arr

if (LineWalkermMarkers_arr != null) {
    RemoveLineWalkerMarkers();
    Log.i(TAG, "LineWalker REMOVED.............................");
}
LineWalkermMarkers_arr = new ArrayList<Marker>();

作为旁注,您应该遵循Java代码约定(变量和方法名称应以小写开头)。您可以找到好的指南herehere

答案 2 :(得分:2)

解决方案只是一个逻辑变化

  1. 根据您的逻辑,仅Marker初始化onCreate一次if(mGoogleMap != null) { mGoogleMap.clear(); } 或其他方法
  2. 如果标记是多个,则应在收到数据后重新初始化。
  3. 可以使用以下逻辑
  4. 清除创建的标记
    //With your logic , this check should be done
    if(arraylist_DetailLineWalker.size()>0){
       RemoveLineWalkerMarkers();
    }
    LineWalkermMarkers_arr = new ArrayList<Marker>();
    for (int i = 0; i < arraylist_DetailLineWalker.size(); i++)
    {
    }
    
    1. 重复使用此标记从最后一个位置移动到新位置。或者,一旦收到数据,就重新创建所有标记
    2.     private Marker mCurrentMarker;
          private float ZOOMLEVEL=18.0f;
          private LatLng previousLatLon;
          private Handler mLocalHandler;
          private GoogleMap mGoogleMap;
      
          @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
      
              mLocalHandler = new Handler();
              previousLatLon=new LatLng(45.320372, 2.460161);
              //Initialize Marker once Google Map object is created
              mMarkerOptions = new MarkerOptions().icon(BitmapDescriptorFactory.fromResource(R.drawable.custom_marker_icon));
              mMarkerOptions.position(previousLatLon);
              mCurrentMarker = mGoogleMap.addMarker(mMarkerOptions);
      
      
          }
      
          /**
           * Call this method to move marker in map to new location in map with updated location
           * @param marker
           * @param toPosition
           * @param fromPosition
           */
          public void animateMarker(final Marker marker, final LatLng toPosition,final LatLng fromPosition) {
      
      
              final long duration = 500;
              final Interpolator interpolator = new LinearInterpolator();
      
              mLocalHandler.post(new Runnable() {
                  @Override
                  public void run() {
                      long elapsed = SystemClock.uptimeMillis() - mStartTime;
                      float t = interpolator.getInterpolation((float) elapsed
                              / duration);
                      marker.setPosition(toPosition);
                      marker.setAnchor(Constants.MAPANCHOR, Constants.MAPANCHOR);
                      mGoogleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(toPosition, ZOOMLEVEL));
                      if (t < 1.0) {
                          // Post again 16ms later.
                          mLocalHandler.postDelayed(this, 16);
                      } else {
                          marker.setVisible(true);
                      }
                      }
                  }
              });
              previousLatLon=toPosition;// reassign the previous location to current location
          }
      

      移动单个标记的替代简易方法,显示实时驾驶方向类型的特征

      // Dummy implementation which only works for some type.
      class Value {
        long value_;
      public:
        template<class T>
        T get()
        {
          return (T) value_;
        }  
        template<class T>
        Value& operator=(T const& x)
        {
          value_ = x;
          return *this;
        }
      };