1

我正在實施谷歌地圖應用程序,我正在對我的服務器進行api調用,並接收少數人或對象或任何可以視爲的東西的當前位置。在每個API調用中,每個對象的響應位置都會發生變化。收到迴應後,我會根據收到的位置和ID添加標記。我可以將標記加起來,但我在標記的添加過程中刪除了在同一過程中添加的所有以前的標記,但不幸的是它正在工作,但爲相同的標識維護兩個標記實例。標記添加兩次在異步任務中的API調用

這是線程調用API調用

public class GetNearbyVehicle extends AsyncTask<String, Void, ArrayList<ActiveVehiclePosition>> { 
static GoogleMap mMap; 

static ArrayList<ActiveVehiclePosition> activeVehiclePositionArrayList; 
static HashMap<ActiveVehiclePosition, Marker> activeVehiclePositionHashMap; 
public static HashMap<ActiveVehiclePosition, Marker> getNearbyVehicle(GoogleMap mMap1, HashMap<ActiveVehiclePosition, Marker> oldVehiclePositionHashMap){ 
    String url= "some url"; 
    mMap= mMap1; 
    if(oldVehiclePositionHashMap != null){ 
     for (Map.Entry<ActiveVehiclePosition, Marker> entry : oldVehiclePositionHashMap.entrySet()) { 
      Marker m= entry.getValue(); 
      m.remove(); 
     } 
    } 
    new GetNearbyVehicle().execute(url); 
    return activeVehiclePositionHashMap; 
} 
@Override 
protected ArrayList<ActiveVehiclePosition> doInBackground(String... params) { 
    String url= params[0]; 
    try { 
     ArrayList<ActiveVehiclePosition> ar= new ArrayList<>(); 
     ar= JsonConverter.getNearByVehicle(url); 
     if(ar != null){ 
      activeVehiclePositionArrayList= ar; 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return activeVehiclePositionArrayList; 
} 

@Override 
protected void onPostExecute(ArrayList<ActiveVehiclePosition> activeVehiclePositions) { 
    super.onPostExecute(activeVehiclePositions); 

    activeVehiclePositionHashMap= new HashMap<>(); 
    if(activeVehiclePositions != null){ 
     for(int i=0; i<activeVehiclePositions.size(); i++){ 
      MarkerOptions markerOptions= new MarkerOptions(); 
      markerOptions.position(activeVehiclePositions.get(i).getLatLng()); 
      markerOptions.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_MAGENTA)); 
      markerOptions.title(activeVehiclePositions.get(i).getDriver().getName()); 
      activeVehiclePositionHashMap.put(activeVehiclePositions.get(i), mMap.addMarker(markerOptions)); 
     } 
    } 

} 

}

這是從哪兒我叫線程的位置。

@Override 
public void onLocationChanged(Location location) { 
    currLatLng = new LatLng(location.getLatitude(), location.getLongitude()); 
    if(sourceMarker != null && LOOKING_FOR == CURRENT_LOCATION_POINTER) sourceMarker.remove(); 
    else if(destinationMarker != null && LOOKING_FOR == FINAL_LOCATION_POINTER) destinationMarker.remove(); 
    if(LOOKING_FOR == CURRENT_LOCATION_POINTER){ 
     setCurrentLocationMarker(currLatLng, sourceMarker); 
     activeVehiclePositionArrayList= GetNearbyVehicle.getNearbyVehicle(mMap, activeVehiclePositionArrayList); 
    } 
    else if(LOOKING_FOR == FINAL_LOCATION_POINTER){ 
     setCurrentLocationMarker(currLatLng, destinationMarker); 
    } 
} 

enter image description here

這是我從API調用添加的標記是在品紅顏色。 我無法理解它有什麼問題。誰能幫我嗎?

注意:實時發生的情況是,兩個標記之一消失並且佔據新的位置,並且這個交替地繼續。

但理想情況是所有應該同時消失並同時佔據新的位置。

回答

0

儘管我設法通過將異步任務設置爲內部類來實現這一目標,但我仍然想知道如果我將Async Task保留爲獨立類,那麼我將如何執行此操作?

private static class GetNearbyVehicle extends AsyncTask<String, Void, ArrayList<ActiveVehiclePosition>> { 
    ArrayList<ActiveVehiclePosition> activeVehiclePositionArrayList; 
    public static void getNearbyVehicle(){ 
     String url= "some url"; 
     if(oldVehiclePositionArrayList != null){ 
      for (Map.Entry<ActiveVehiclePosition, Marker> entry : oldVehiclePositionArrayList.entrySet()) { 
       Marker m= entry.getValue(); 
       m.remove(); 
      } 
     } 
     new GetNearbyVehicle().execute(url); 
    } 
    @Override 
    protected ArrayList<ActiveVehiclePosition> doInBackground(String... params) { 
     String url= params[0]; 
     try { 
      ArrayList<ActiveVehiclePosition> ar= new ArrayList<>(); 
      activeVehiclePositionArrayList= JsonConverter.getNearByVehicle(url); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return activeVehiclePositionArrayList; 
    } 

    @Override 
    protected void onPostExecute(ArrayList<ActiveVehiclePosition> activeVehiclePositions) { 
     super.onPostExecute(activeVehiclePositions); 

     oldVehiclePositionArrayList= new HashMap<>(); 
     if(activeVehiclePositions != null){ 
      for(int i=0; i<activeVehiclePositions.size(); i++){ 
       MarkerOptions markerOptions= new MarkerOptions(); 
       markerOptions.position(activeVehiclePositions.get(i).getLatLng()); 
       markerOptions.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_MAGENTA)); 
       markerOptions.title(activeVehiclePositions.get(i).getDriver().getName()); 
       oldVehiclePositionArrayList.put(activeVehiclePositions.get(i), mMap.addMarker(markerOptions)); 
      } 
     } 


    } 
}