2011-07-29 5 views
1

J'ai développé une application qui lit un fichier .csv, prend environ 16 points de latitude/longitude, et les trace sur une carte Google. Cependant, il semble que les points n'aiment pas tracer jusqu'à ce que je touche l'écran après environ une minute (je n'ai pas d'auditeurs établis) [c'est un problème distinct que quelqu'un peut peut-être répondre aussi bien].Google Map Lag sur Android

La tâche d'obtenir les points de latitude/longitude et de les tracer est mise dans une méthode asyncTask doInBackground. L'actualisation de l'état pouvant être tracé de la carte est effectuée dans la méthode onPostExecute de la AsyncTask. J'ai pensé que j'éliminerais le décalage puisque la méthode AsyncTask fonctionne pour moi. Quand le programme commence, il montre une carte vierge, j'attends environ 15 secondes et, si je touche la carte, les points vont se brancher. Cependant, la carte est insupportablement laggy à ce stade! Il faut l'application au moins 5 secondes pour répondre à mon interaction (c'est-à-dire zoom, défilement), et même alors, l'action est vraiment lente ...

Est-ce que quelque chose pense en connaître la cause?

est ici la plupart de mon code:

package net.learn2develop.GoogleMaps; 

-- imports here 


public class MapsActivity extends MapActivity 
{  
MapView mapView; 
MapController mc; 
//GeoPoint p; 
//GeoPoint p2; 
GeoPoint[] p99 = new GeoPoint[16]; 
public static String[][] bump = null; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    mapView = (MapView) findViewById(R.id.mapView); 
    LinearLayout zoomLayout = (LinearLayout)findViewById(R.id.zoom); 
    @SuppressWarnings("deprecation") 
    View zoomView = mapView.getZoomControls(); 

    mapView.setStreetView(true); 
    mapView.setSatellite(false); 

    zoomLayout.addView(zoomView, 
     new LinearLayout.LayoutParams(
      LayoutParams.WRAP_CONTENT, 
      LayoutParams.WRAP_CONTENT)); 
    mapView.displayZoomControls(true); 

    mc = mapView.getController(); 


    // Add points from ReadCsv.java 

    /** try/catch to-> async was cut from here */ 
    new MapPoint().execute(bump); 


    mapView.invalidate(); 
} 

public String[][] getArray(BufferedReader bufRdr) { 
      -- my method that I know works 
} 


@Override 
protected boolean isRouteDisplayed() { 
    return false; 
} 

class MapOverlay extends com.google.android.maps.Overlay { 
    @Override 
    public boolean draw(Canvas canvas, MapView mapView, 
      boolean shadow, long when) 
    { 
     super.draw(canvas, mapView, shadow);     

     // -- array of points--- 
     for(int i = 0; i < bump.length; i++) { 
      Point screenPts99 = new Point(); 
      mapView.getProjection().toPixels(p99[i], screenPts99); 
      Bitmap bmp99 = BitmapFactory.decodeResource(
        getResources(), R.drawable.redpin); 
      canvas.drawBitmap(bmp99, screenPts99.x, screenPts99.y-44, null); 
     } 

     return true; 
    } 
} 

private class MapPoint extends AsyncTask <String[][], String, String> { 

    @Override 
    protected String doInBackground(String[][]... voidThisArray) { 
     String voidThisString = null; 
     try { 
      InputStream is = getAssets().open("Training4.csv"); 
      BufferedReader reader = new BufferedReader(new InputStreamReader(is)); 
      bump = getArray(reader); 
      if(bump == null){ 
       setContentView(R.layout.deleteme); 
      } else { 
       for(int i = 0; i < bump.length; i++) { 
        String coordinates99[] = {bump[i][0], bump[i][1]}; 
        double lat99 = Double.parseDouble(coordinates99[0]); 
        double lng99 = Double.parseDouble(coordinates99[1]); 
        p99[i] = new GeoPoint(
          (int) (lat99 * 1E6), 
          (int) (lng99 * 1E6)); 
        MapOverlay mapOverlay99 = new MapOverlay(); 
        List<Overlay> listOfOverlays99 = mapView.getOverlays(); 
        listOfOverlays99.add(mapOverlay99); 
        mapView.refreshDrawableState(); 
       } 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     return voidThisString; 
    } 

    @Override 
    protected void onPostExecute(String voidThisString) { 
     super.onPostExecute(voidThisString); 
     mapView.refreshDrawableState(); 
     mapView.invalidate(); 
    } 

} 

} 
+0

vérifier la autre réponse – Pratik

Répondre

1

à onPostExecute utiliser le mapView.invalidate(); méthode il va l'actualiser et tout ce que vous avez fait dans inBackground() qui sera rafraîchissante par cette méthode

+0

J'ai ajouté mapView.invalidate(); et je reçois toujours un décalage similaire. Y at-il quelque chose que vous aimeriez que je poste pour peut-être vous aider à me guider vers ce problème? – Mxyk

+0

pouvez-vous me montrer votre code? – Pratik

+0

Le code est maintenant au bas de ma question – Mxyk

1

vous ajoutez la MapOverlay dans la boucle pour que chaque superpositions contiennent des points bump.length. donc il deviendra lent ajouter lapplication de point.

d'abord obtenir toutes les lat/lng et stocker dans le tableau de p99, puis ajoutez le mapoverlay

mettre en œuvre le code

try { 
     InputStream is = getAssets().open("Training4.csv"); 
     BufferedReader reader = new BufferedReader(new InputStreamReader(is)); 
     bump = getArray(reader); 
     if(bump == null){ 
      setContentView(R.layout.deleteme); 
     } else { 
      for(int i = 0; i < bump.length; i++) { 
       String coordinates99[] = {bump[i][0], bump[i][1]}; 
       double lat99 = Double.parseDouble(coordinates99[0]); 
       double lng99 = Double.parseDouble(coordinates99[1]); 
       p99[i] = new GeoPoint(
         (int) (lat99 * 1E6), 
         (int) (lng99 * 1E6)); 
      } 
       MapOverlay mapOverlay99 = new MapOverlay(); 
       List<Overlay> listOfOverlays99 = mapView.getOverlays(); 
       listOfOverlays99.add(mapOverlay99); 
       mapView.refreshDrawableState(); 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

votre tirage()

public boolean draw(Canvas canvas, MapView mapView, 
     boolean shadow, long when) 
{ 
    super.draw(canvas, mapView, shadow);     

    // -- array of points--- 
    if(bump!=null){ 
     for(int i = 0; i < bump.length; i++) { 
     Point screenPts99 = new Point(); 
     mapView.getProjection().toPixels(p99[i], screenPts99); 
     Bitmap bmp99 = BitmapFactory.decodeResource(
       getResources(), R.drawable.redpin); 
     canvas.drawBitmap(bmp99, screenPts99.x, screenPts99.y-44, null); 
     } 
    } 

    return true; 
} 
+0

Quelle partie du code avez-vous changé? – Mxyk

+0

Aussi - Merci beaucoup! Le décalage n'est pas complètement disparu, mais la carte répond à mes actions à peu près à temps. Le mouvement est un peu fuyant mais franchement je peux m'en occuper, c'est bien mieux que d'attendre 5 secondes pour une réaction. :) – Mxyk

+0

Je sais que cette question est assez ancienne, mais je tiens à souligner que créer une nouvelle instance bitmap pour chaque entrée dans le tableau (via 'Bitmap bmp99 = BitmapFactory.decodeResource (getResources(), R.drawable.redpin); ') est tout à fait inutile et ajoute beaucoup de frais généraux. Vous devriez probablement déplacer cette ligne avant l'instruction 'for'. – Mannaz