每 1 分钟从服务器获取的 Gps LatLong 在地图中显示为标记。但是标记正在复制

Every 1 Minute Gps LatLong Getting From Server Showing In Map as Marker. But Marker Geting Duplicating

1.In 我的应用程序 Gps LatLong 每隔一分钟从服务器获取一次。保存在 Shared Pref 中,然后从共享 pref 中获取 LatLong 在地图上显示 Marker

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

3.But 正在更改标记位置。获取重复项.

请帮我解决这个问题。

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();
        }

我正在使用的方法:

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();
    }

您在初始化 LineWalkermMarkers_arr 后调用 RemoveLineWalkerMarkers() 并执行 LineWalkermMarkers_arr = new ArrayList<Marker>();,因此您永远不会删除标记。

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

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

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

解决方案只是逻辑上的改变

  1. 仅初始化 Marker 一次,onCreate 或根据您的逻辑采用其他方法
  2. 如果有多个标记,则接收到数据后应重新初始化。
  3. 可以使用以下逻辑清除创建的标记

if(mGoogleMap != null) {
        mGoogleMap.clear();
 }
  1. 重复使用此标记以从上一个位置移动到新位置。或者重新创建所有标记,一旦收到数据

//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++)
{
}

移动单个标记的替代简单方法,以显示实时行车方向类特征

    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
    }
if(arraylist_DetailLineWalker != null && arraylist_DetailLineWalker.size()>0){
    arraylist_DetailLineWalker.clear()
    mMap.clear();
    showMarker();
}