2013-01-22 7 views
5

Używam api Google maps v2 dla aplikacji na Androida, którą buduję, która ma narysować wielokąty na mapie. Wszystko działa dobrze, gdy liczba wielokątów jest mała, gdy liczba jest większa, mapa ładuje się powoli, a przesuwanie i powiększanie jest bardzo powolne. Używam SupportMapFragment i dodanie wielokątów tak:Android Google Maps v2 problem z wydajnością wielokątów?

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

Czy istnieje jakiś sposób, aby poprawić wydajność dla dużej liczby wielokątów?

+0

O ile mi wiadomo, ten proces MUSI być wykonywany NIE w głównym wątku, ALE w osobnym wątku lub AsyncTask. Jeśli w swoim kodzie nie używasz wątku (używając programu Handler) lub klasy AsyncTask, ich narzędzia są wymagane z góry. – BBonDoo

+2

Jest to rzeczywiście wymaganie wywołania addPolygon z głównego wątku. API map wyrzuci wyjątek IllegalStateException, ponieważ nie jest w głównym wątku podczas wywoływania addPolygon z wątku w tle. – Bobbake4

+0

@ Bobbake4 czy rozwiązałeś swój problem? Mam taki sam problem, jeśli znajdziesz rozwiązanie, proszę powiedz mi, –

Odpowiedz

0

Bobbake4 jest poprawny. Android wymaga, aby addPolygon znajdował się w głównym wątku. Mam podobny problem. Obecnie jestem realizacji asynctask ale nie wydaje się być sposobem wykonywania addPolygon z doInBackground mojego obecnego kodu jest poniżej:

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

Idealnie chciałbym addPolygon tło ... Czy jest jakiś inny sposób na uzyskanie to zrobić?

1

Chcę również narysować wiele wielokątów na mapie w tle, ponieważ ładowanie i montaż wierzchołków zajmuje czas. Rozwiązaniem, które zadziałało, było załadowanie danych w AsyncTask, a następnie przekazanie punktów dla każdego wielokąta, ponieważ jest odczytywane z powrotem do metody w głównym interfejsie użytkownika w metodzie 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) { } 
} 

Gdzie drawBorder w głównym interfejsie użytkownika dodaje je do obiektu mapy.