Salve. Nell'app che ho realizzato mi occupo di mostrare tracciati e il modo per arrivarci. Non mi sono occupato di progettare proprio correttamente il codice, a parte le cose fondamentali. Le situazioni fondamentali sono queste:
1) L'utente disegna un tracciato già pronto scaricato dalla rete. Ne faccio il parsing per ottenere la lista di oggetti LatLng (contengono la coppia latitudine/longitudine) e disegno le polilinee.
2) L'utente disegna un suo tracciato inserendo dei Markers. Creo la lista di LatLng a partire dai Markers inseriti che incapsulano la coppia latitudine/longitudine, faccio una richiesta http per ogni coppia e concateno i risultati per ottenere il percorso.
2bis) L'utente disegna un suo tracciato unendo semplicemente tramite un segmento i Markers inseriti.
3) Indipendentemente dalle situazioni precedenti l'utente può decidere di disegnare anche il percorso verso il tracciato (sempre richiesta http).
Queste operazioni vengono svolte tutte nella stessa classe, e mi ritrovo con:
codice:
private ArrayList<LatLng> mLatLngList; //Lista di LatLng ricavate dal file gpx importato
private ArrayList<LatLng> mMyLatLngList; //Lista di LatLng ricavate dal disegno di un tracciato
private ArrayList<Marker> mMarkersList; //Lista di Markers per disegnare un tracciato
private ArrayList<Polyline> mPathPolylines; //Polylines del percorso
private ArrayList<Polyline> mTrackPolylines; //Polylines del tracciato disegnato
Ho dovuto creare varie variabili per capire in che situazione mi trovo quando vado a fare i disegni creando codice di difficile comprensione o ripetuto.
Ad esempio per spostare la visuale sul tracciato disegnato mi tocca fare:
codice:
//Sposta la visuale sul tracciato se presente
public void seeItinerary(View v) {
if(mLatLngList.isEmpty() && mMyLatLngList.isEmpty() && (mMergedMarkers == false)) {
Toast.makeText(MainActivity.this, "Non c'è nessun percorso!", Toast.LENGTH_SHORT).show();
return;
}
if(!mLatLngList.isEmpty()) {
int size = mLatLngList.size();
LatLng goToLatLng = mLatLngList.get(size/2);
mGoogleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(goToLatLng, 10));
mGoogleMap.animateCamera(CameraUpdateFactory.zoomTo(12), 2000, null);
}
if(!mMyLatLngList.isEmpty()) {
int size = mMyLatLngList.size();
LatLng goToLatLng = mMyLatLngList.get(size/2);
mGoogleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(goToLatLng, 10));
mGoogleMap.animateCamera(CameraUpdateFactory.zoomTo(12), 2000, null);
}
if(mMergedMarkers) {
int size = mMarkersList.size();
LatLng goToLatLng = mMarkersList.get(size/2).getPosition();
mGoogleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(goToLatLng, 10));
mGoogleMap.animateCamera(CameraUpdateFactory.zoomTo(12), 2000, null);
}
}
Perché devo capire a quale lista fare riferimento, e la stessa ripetizione mi tocca farla in altri casi, ad esempio quando devo calcolare il punto del tracciato più vicino alla mia posizione, devo verificare che tipo di tracciato è stato disegnato (gli stessi if di prima).
Oppure al termine della richiesta HTTP dentro l'AsyncTask:
codice:
protected void onPostExecute(String result) {
super.onPostExecute(result);
if(mDialog != null) {
if(mDialog.isShowing()) {
mDialog.dismiss();
}
}
if(result!=null){
//flag in questo caso viene utilizzato per capire se si sta calcolando un percorso
//verso il tracciato oppure se si sta calcolando un tracciato tra vari markers
if(flag) {
//Se è stato già disegnato un tracciato
if(!mPathPolylines.isEmpty()) {
//lo cancello
for(int i=0; i<mPathPolylines.size(); i++) {
mPathPolylines.get(i).remove();
}
mPathPolylines.clear();
}
drawPath(result,true); //Disegno il nuovo percorso
}
else {
drawPath(result,false);
}
}
else {
Toast.makeText(MainActivity.this, "Timeout o assenza di connessione", Toast.LENGTH_SHORT).show();
}
}
Mi tocca districarmi con questo codice per cercare di non fare casini. Alla classe dovrebbero essere associati due tipi di percorsi e basta: quello per arrivare ed il percorso stesso. Poi il comportamento dovrebbe essere indipendente dalla situazione. C'è UN percorso? Ok, il metodo per il suo disegno deve essere unico, il metodo per spostarci la visuale sopra deve essere semplice senza if o distinguere i casi. Il tutto diverrebbe molto più pulito. Qualsiasi consiglio è ben accetto!