Google Map Lag на Android - PullRequest
       12

Google Map Lag на Android

1 голос
/ 29 июля 2011

Я занимаюсь разработкой приложения, которое читает файл .csv, выбирает приблизительно 16 точек широты / долготы и наносит их на карту Google.

Тем не менее, кажется, что точки не любят отображаться, пока я не коснусь экрана примерно через минуту (у меня не установлено прослушивателей) [это отдельная проблема, на которую, возможно, кто-то также может ответить].

Задача получения точек широты / долготы и их построения помещается в метод AsyncTask doInBackground. Обновление состояния рисования карты выполняется в методе AsyncTask onPostExecute.

Я подумал, что устраню отставание, так как у меня работает метод AsyncTask. Когда программа запускается, она показывает пустую карту, я жду около 15 секунд, и, если я прикоснусь к карте, точки будут подключены. Тем не менее, карта невыносимо запаздывает в этой точке! Приложению требуется не менее 5 секунд, чтобы отреагировать на мое взаимодействие (например, масштабирование, прокрутка), и даже тогда оно действительно замедляет действие ...

Кто-нибудь думает, что они знают причину этого?

Вот большая часть моего кода:

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

}

}

Ответы [ 2 ]

1 голос
/ 29 июля 2011

вы добавляете MapOverlay в цикл for, чтобы в каждом наложении были точки bump.length. поэтому будет медленно добавлять дублирование точки.

сначала получите все значения lat / lng и сохраните их в массиве p99, а затем добавьте mapoverlay

код реализации

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

ваш розыгрыш ()

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;
} 
1 голос
/ 29 июля 2011

в onPostExecute используйте mapView.invalidate ();метод, он обновит его, и все, что вы сделали в inBackground (), будет обновляться этим методом

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...