1

J'applique l'application google map où je fais un appel api à mon serveur et reçoit l'emplacement actuel de peu de personne ou d'objet ou de tout ce que vous pouvez considérer comme. À chaque appel API, l'emplacement de réponse de chaque objet change. A la réception de la réponse, j'ajoute un marqueur sur la base du lieu et de l'identifiant reçu. Je suis capable d'additionner le marqueur, mais dans le processus d'ajout de marqueur, je supprime tout le marqueur précédent ajouté dans le même processus mais malheureusement, il fonctionne mais conserve deux instances de marqueur pour le même identifiant.Marqueur est ajouté deux fois sur l'appel api dans la tâche asynchrone

C'est l'appel de fil pour l'appel 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)); 
     } 
    } 

} 

}

C'est l'endroit où j'ai appelé le fil.

@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

Le marqueur qui j'ajouté de l'appel API est de couleur magenta. Je ne pouvais pas comprendre ce qui ne va pas. Quelqu'un peut m'aider?

NB: En temps réel ce qui se passe ici est, sur deux marqueurs on disparaît et prend une nouvelle position et cela continue alternativement.

Mais idéalement, tout devrait disparaître simultanément et prendre une nouvelle position simultanément.

Répondre

0

Bien que j'ai réussi à faire fonctionner le truc en faisant la tâche asynchrone comme classe interne mais je veux quand même savoir si je garde Async Task comme classe indépendante alors comment vais-je le faire?

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


    } 
}