2011-07-29 53 views
1

我一直在開發一個讀取.csv文件的應用程序,取出大約16個經度/緯度點,並將它們繪製在Google地圖上。Android上的Google地圖滯後

但是,似乎這些點不喜歡直到我在大約一分鐘後觸摸屏幕(我沒有建立聽衆)[這是一個單獨的問題,也許有人可以回答]。

獲取緯度/經度點並繪製它們的任務被放入AsyncTask doInBackground方法中。刷新地圖的可繪製狀態是在AsyncTask的onPostExecute方法中完成的。

我想我會消除滯後,因爲我有AsyncTask方法爲我工作。當程序啓動時,它會顯示一張空白地圖,我等待大約15秒,如果我觸摸地圖,這些點將插入。但是,此時地圖是難以忍受 laggy!這需要應用至少 5秒到我的相互作用(即縮放,滾動)作出迴應,而且即便如此,它的動作很慢...

做任何事情想他們知道這樣做的原因是什麼?

這裏是我的大部分代碼:在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

您將MapOverlay添加到for循環中,所以每個疊加層都會包含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; 
} 
+0

你改變了代碼的哪部分? – Mxyk

+0

另外 - 非常感謝!滯後並沒有完全消失,但地圖對我的行爲做出了很大的迴應。這個動作有點狡猾,但說實話我可以處理這個問題,比等待5秒鐘反應要好得多。 :) – Mxyk

+0

我知道這個問題是相當古老的,但我想指出,創建一個新的位圖實例爲數組中的每個條目(通過「位圖bmp99 = BitmapFactory.decodeResource(getResources(),R.drawable.redpin );')是非常不必要的,並增加了很多開銷。您應該將此行移至'for'語句之前。 – Mannaz