1

.csv ファイルを読み取り、約 16 の緯度/経度ポイントを取り出し、それらを Google マップにプロットするアプリを開発しています。

ただし、約1分後に画面に触れるまで、ポイントがプロットされないようです(リスナーが確立されていません)[これは別の問題であり、誰かが同様に回答できる可能性があります]。

緯度/経度ポイントを取得してプロットするタスクは、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();
    }

}

}
4

2 に答える 2

1

onPostExecute では、mapView.invalidate(); を使用します。メソッドはそれをリフレッシュし、このメソッドによってリフレッシュされる inBackground() で行ったことは何でも

于 2011-07-29T14:01:32.817 に答える
1

forループにMapOverlayを追加して、各オーバーレイにbump.lengthポイントが含まれるようにします。そのため、ポイントの重複を追加するのが遅くなります。

最初にすべての緯度/経度を取得し、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;
} 
于 2011-07-29T14:38:31.103 に答える