2011-07-29 9 views
1

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

しかし、約1分後に画面に触れるまで(私はリスナーがいない)プロットするのが好きではないようです[これは誰かが答えるかもしれない別の問題です]。

緯度/経度のポイントを取得してプロットするタスクは、AsyncTask doInBackgroundメソッドに入れられます。マップの描画可能状態の更新は、AsyncTaskのonPostExecuteメソッドで実行されます。

私は、AsyncTaskメソッドが私のために働いているので、私はラグを排除すると思った。プログラムが起動すると、空白の地図が表示されます。約15秒待って、地図に触れるとポイントが差し込まれます。この時点ではラグです!私のインタラクション(ズーム、スクロール)に反応するには、アプリケーションは少なくとも秒かかるので、実際には遅くなります...

何が原因だと思いますか?

ここに私のコードのほとんどだ:onPostExecuteで

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

チェックアウト別の答え – Pratik

答えて

1

はmapView.invalidate()を使用します。メソッドをリフレッシュし、inBackground()で行った処理をこのメソッドでリフレッシュします

+0

私はmapView.invalidate()を追加しました。私はまだ同様の遅れを得ています。投稿したいと思うものがありますか?問題の原因を教えてくれるでしょうか? – Mxyk

+0

あなたのコードを教えていただけますか? – Pratik

+0

コードは今質問の末尾にある – Mxyk

1

forループのMapOverlayを追加すると、各オーバーレイにはbump.lengthポイントが含まれます。 だから、速度が遅くなり、ポイントのdupplicationが追加されます。

最初のコードを実装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; 
} 
+0

コードのどの部分を変更しましたか? – Mxyk

+0

また、ありがとう!遅れは完全になくなっていませんが、地図は私の行動にかなり時間を置いて反応します。動きはややこしいですが、正直なところ私はそれに対処できます。反応が5秒間待つよりもはるかに優れています。 :) – Mxyk

+0

私はこの質問がかなり古くなっていることを知っていますが、 'Bitmap bmp99 = BitmapFactory.decodeResource(getResources()、R.drawable.redpin );)は非常に不必要で、オーバーヘッドが大きくなります。おそらくこの行を 'for'文の前に移動するべきです。 – Mannaz