2013-01-22 15 views
5

Sto usando l'API Google maps v2 per un'applicazione Android che sto costruendo e che deve disegnare poligoni sulla mappa. Tutto funziona bene quando il numero di poligoni è piccolo, quando il numero è più grande la mappa si carica lentamente e il panning e lo zoom sono molto lenti. Sto usando SupportMapFragment e poligoni aggiungendo in questo modo:Problema di prestazioni del poligono di Google Maps v2 per Android?

for(PolygonOptions item : items) { 
      getMap().addPolygon(poly); 
    } 

Esiste un modo per migliorare le prestazioni per un gran numero di poligoni?

+0

Per quanto ne so, questo processo DEVE essere eseguito NON nel thread principale, MA nel Thread separato o AsyncTask. Se non si utilizza la classe Thread (utilizzando Handler) o AsyncTask nel proprio codice, è necessario che le loro implementazioni siano richieste in anticipo. – BBonDoo

+2

In realtà è un requisito per chiamare addPolygon dal thread principale. L'API delle mappe genererà un IllegalStateException per non essere sul thread principale quando si chiama addPolygon da un thread in background. – Bobbake4

+0

@ Bobbake4 hai risolto il tuo problema? Ho lo stesso problema se trovi la soluzione per favore dimmi –

risposta

0

Bobbake4 è corretto. Android richiede addPolygon per essere sul thread principale. Ho anche un problema simile. Attualmente sto attuando AsyncTask, ma non sembra essere un modo per eseguire addPolygon da doInBackground mio codice corrente è inferiore:

private class AddPolygonToMap extends 
     AsyncTask<String, Integer, ArrayList<PolygonOptions>> { 

    @Override 
    protected ArrayList<PolygonOptions> doInBackground(String... urls) { 
     publishProgress(1); 
     return drawPolygonWithPage(urls[0]); 
    } 

    @Override 
    protected void onProgressUpdate(Integer... progress) { 
     int value = progress[0] + progressBar.getProgress(); 
     progressBar.setProgress(value); 
    } 

    @Override 
    protected void onPostExecute(ArrayList<PolygonOptions> result) { 
     for (int i = 0; i < result.size(); i++) { 
      map.addPolygon(result.get(i)); 
     } 
    } 
} 

Preferirei addPolygon fondo ... C'è un altro modo di ottenere questo fatto?

1

Voglio anche disegnare molti poligoni sulla mappa in background perché caricare e assemblare i vertici richiede tempo. La soluzione che ha funzionato per me è stata caricare i dati in AsyncTask quindi passare i punti per ogni poligono mentre viene riletto su un metodo nell'interfaccia utente principale nel metodo onProgressUpdate.

private class AddZonesTask extends AsyncTask<Zone, Zone, Integer> { 
    protected Integer doInBackground(Zone... zones) { 
    for (Zone zone : zones) { 
     Cursor cursor = provider.query(....); 
     List<Points> points = cursorToPointsMethod(cursor); 
     zone.add(points); 
     publishProgress(zone); 
    } 
    return zones.length; 
    } 

    protected void onProgressUpdate(Zone... zones) { 
    drawBorder(zones[0]); 
    } 

    protected void onPostExecute(Integer result) { } 
} 

Dove drawBorder nella UI principale poi li aggiunge all'oggetto mappa.

Problemi correlati