2

Google APIで多くのアイコンを表示したい(2,000個以上のアイコン)。私はこのtutoに基づいて簡単な活動を作成しました。Android:Googleマップがズームするとクラッシュする(1500個以上のアイコン)

マップにアクセスするときに問題のアイコンが表示されずに表示されます。 I /アウトで数回ズームしかし、java.lang.OutOfMemoryErrorを:ここで

12-16 08:48:29.415: E/dalvikvm-heap(606): 680640-byte external allocation too large for this process. 
12-16 08:48:29.415: E/GraphicsJNI(606): VM won't let us allocate 680640 bytes 
12-16 08:48:29.415: D/AndroidRuntime(606): Shutting down VM 
12-16 08:48:29.415: W/dalvikvm(606): threadid=1: thread exiting with uncaught exception (group=0x4001d800) 
12-16 08:48:29.425: E/AndroidRuntime(606): FATAL EXCEPTION: main 
12-16 08:48:29.425: E/AndroidRuntime(606): java.lang.OutOfMemoryError: bitmap size exceeds VM budget 
12-16 08:48:29.425: E/AndroidRuntime(606): at android.graphics.Bitmap.nativeCreate(Native Method) 
12-16 08:48:29.425: E/AndroidRuntime(606): at android.graphics.Bitmap.createBitmap(Bitmap.java:468) 
12-16 08:48:29.425: E/AndroidRuntime(606): at com.google.android.maps.ZoomHelper.createSnapshot(ZoomHelper.java:444) 
12-16 08:48:29.425: E/AndroidRuntime(606): at com.google.android.maps.ZoomHelper.doZoom(ZoomHelper.java:151) 
12-16 08:48:29.425: E/AndroidRuntime(606): at com.google.android.maps.ZoomHelper.doZoom(ZoomHelper.java:140) 
12-16 08:48:29.425: E/AndroidRuntime(606): at com.google.android.maps.MapView.doZoom(MapView.java:1478) 
12-16 08:48:29.425: E/AndroidRuntime(606): at com.google.android.maps.MapView.doZoom(MapView.java:1487) 
12-16 08:48:29.425: E/AndroidRuntime(606): at com.google.android.maps.MapView$4.onClick(MapView.java:1381) 
12-16 08:48:29.425: E/AndroidRuntime(606): at android.view.View.performClick(View.java:2408) 
12-16 08:48:29.425: E/AndroidRuntime(606): at android.view.View$PerformClick.run(View.java:8816) 
12-16 08:48:29.425: E/AndroidRuntime(606): at android.os.Handler.handleCallback(Handler.java:587) 
12-16 08:48:29.425: E/AndroidRuntime(606): at android.os.Handler.dispatchMessage(Handler.java:92) 
12-16 08:48:29.425: E/AndroidRuntime(606): at android.os.Looper.loop(Looper.java:123) 
12-16 08:48:29.425: E/AndroidRuntime(606): at android.app.ActivityThread.main(ActivityThread.java:4627) 
12-16 08:48:29.425: E/AndroidRuntime(606): at java.lang.reflect.Method.invokeNative(Native Method) 
12-16 08:48:29.425: E/AndroidRuntime(606): at java.lang.reflect.Method.invoke(Method.java:521) 
12-16 08:48:29.425: E/AndroidRuntime(606): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
12-16 08:48:29.425: E/AndroidRuntime(606): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
12-16 08:48:29.425: E/AndroidRuntime(606): at dalvik.system.NativeStart.main(Native Method) 

は、私の活動の方法は次のとおりです。

@Override 
public void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState);  
    requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);  
    setContentView(R.layout.google_map);  

    Bundle bundle = getIntent().getExtras(); 

    //MAP  
    mapView = (MapView) findViewById(R.id.mapView); 

    //zoom設定 
    LinearLayout zoomLayout = (LinearLayout)findViewById(R.id.zoom); 
    View zoomView = mapView.getZoomControls(); 

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

    //controller 
    mc = mapView.getController(); 

    double[] adresse = (double[]) bundle.getDoubleArray(Site.LATTITUDE);  
    p = new GeoPoint((int) (adresse[0] * 1E6), (int) (adresse[1] * 1E6)); 

    mc.animateTo(p); 
    mc.setZoom(18); 
    mapView.invalidate(); 

    List<Overlay> listOfOverlays = mapView.getOverlays(); 
    listOfOverlays.clear(); 

    try { 

     //get datas from previous activiity 
     List<SiteGoogle> sitesList = bundle.getParcelableArrayList(Site.JSON_ARRAY); 

     //display message 
     Toast.makeText(getBaseContext(), getResources().getString(R.string.map_toad), Toast.LENGTH_LONG).show(); 

     List<Overlay> mapOverlays = mapView.getOverlays(); 
     mapOverlays.clear(); 

     for(SiteGoogle site: sitesList) { 

      //set icon 
      Drawable drawable = this.getResources().getDrawable(R.drawable.icon01); 

      //icon setting 
      MapItemizedOverlay itemizedoverlay = new MapItemizedOverlay(drawable,this);  

      //geoPoint 
      GeoPoint point = new GeoPoint((int) (site.getLatitude() * 1E6), (int) (site.getLongitude() * 1E6)); 

      //item 
      OverlayItem overlayitem = new OverlayItem(point, String.valueOf(site.getId()), null); 

      itemizedoverlay.addOverlay(overlayitem); 

      //add to map 
      mapOverlays.add(itemizedoverlay); 

     } 

    } catch(Exception e) { 
     Log.e(TAG,e.getMessage()); 
    } 

そして、私のMapItemizedOverlayクラス:

@SuppressWarnings("rawtypes") 
public class MapItemizedOverlay extends ItemizedOverlay { 

    private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>(); 
    private Context mContext; 

    public MapItemizedOverlay(Drawable defaultMarker, Context context) { 
     super(boundCenterBottom(defaultMarker)); 
     mContext = context; 
    } 

    public void addOverlay(OverlayItem overlay) { 
     mOverlays.add(overlay); 
     populate(); 
    } 

    @Override 
    protected OverlayItem createItem(int i) { 
     return mOverlays.get(i); 
    } 

    @Override 
    public int size() { 
     return mOverlays.size(); 
    } 

    @Override 
    protected boolean onTap(int index){ 

     OverlayItem item = mOverlays.get(index); 

     Intent intent = new Intent(mContext, SiteDetailsActivity.class); 
     intent.putExtra(Site.ID, Integer.parseInt(item.getTitle()));   
     mContext.startActivity(intent); 

     return true; 
    } 

私はそれをより速くし、クラッシュさせないために何ができるのか分かりません。キャンバスやキャッシュを使うべきですか?私には考えがない。

答えて

0

私はそれが役立つことをわからないんだけど、あなたはマップにsitesListの上にループ内siteあたりOverlayを追加している:

for(SiteGoogle site: sitesList){ 

     //set icon 
     Drawable drawable = this.getResources().getDrawable(R.drawable.icon01); 


     //icon setting 
     MapItemizedOverlay itemizedoverlay = new MapItemizedOverlay(drawable,this);  

     //geoPoint 
     GeoPoint point = new GeoPoint((int) (site.getLatitude() * 1E6), (int) (site.getLongitude() * 1E6)); 

     //item 
     OverlayItem overlayitem = new OverlayItem(point, String.valueOf(site.getId()), null); 

     itemizedoverlay.addOverlay(overlayitem); 

     //add to map 
     mapOverlays.add(itemizedoverlay); 

     } 

は、だから、2000のオーバーレイと2000のドローアブルとこれを持って終了よくない。

ItemizedOverlayがはるかに効果的な方法で使用することができます:ダース・Beleg私は蚊帳の外「mapOverlays.add(itemizedoverlay)」を入れて、私はのMapView「のchangee位置を持って、言ったように

Drawable drawable = this.getResources().getDrawable(R.drawable.icon01); 
MapItemizedOverlay itemizedoverlay = new MapItemizedOverlay(drawable,this); 

for(SiteGoogle site: sitesList) { 
    GeoPoint point = new GeoPoint((int) (site.getLatitude() * 1E6), (int) (site.getLongitude() * 1E6)); 
    OverlayItem overlayitem = new OverlayItem(point, String.valueOf(site.getId()), null); 

    itemizedoverlay.addOverlay(overlayitem); 
} 
mapOverlays.add(itemizedoverlay); 
+0

、アイコンが画面に表示されていないいない... – johann

+0

非常に奇妙な、おそらくあなたは 'mapView.invalidate(呼び出す必要があります)':

活動のための新しいコードitemizedoverlay。 –

0

.invalidate() "しかし何も現れません。

このプロジェクトのデッドラインは数日後ですが、今日この問題を解決する必要があります。誰かが私を助けることができたら嬉しいです。追加した後、ループの外にmapOverlayを入れたときに

public void onCreate(Bundle savedInstanceState) { 

      super.onCreate(savedInstanceState);  
      requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);  
      setContentView(R.layout.google_map);  

      //SearchActivity parameters 
      Bundle bundle = getIntent().getExtras(); 

      //MAP  
      mapView = (MapView) findViewById(R.id.mapView); 

      //zoom設定 
      LinearLayout zoomLayout = (LinearLayout)findViewById(R.id.zoom); 
      View zoomView = mapView.getZoomControls(); 

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

      mc = mapView.getController(); 

      double[] adresse = (double[]) bundle.getDoubleArray(Site.LATTITUDE);  
      p = new GeoPoint((int) (adresse[0] * 1E6), (int) (adresse[1] * 1E6)); 

      mc.animateTo(p); 
      mc.setZoom(18); 


      //get current position 
      List<Overlay> listOfOverlays = mapView.getOverlays(); 
      listOfOverlays.clear(); 

      try{ 

       //get icon position informations 
       List<SiteGoogle> sitesList = bundle.getParcelableArrayList(Site.JSON_ARRAY); 

       //message diplay 
       Toast.makeText(getBaseContext(), getResources().getString(R.string.map_toad), Toast.LENGTH_LONG).show(); 

       List<Overlay> mapOverlays = mapView.getOverlays(); 
       mapOverlays.clear(); 

       MapItemizedOverlay itemizedoverlay = null; 

       for(SiteGoogle site: sitesList){ 

        //set the icon 
        Drawable drawable; 

        switch (site.getCategory()){ 
         case 1: 
          drawable = this.getResources().getDrawable(R.drawable.icon01); 
          break; 
         case 2: 
          drawable = this.getResources().getDrawable(R.drawable.icon02); 
          break; 
         case 3: 
          drawable = this.getResources().getDrawable(R.drawable.icon03); 
          break; 
         case 4: 
          drawable = this.getResources().getDrawable(R.drawable.icon04); 
          break; 
         case 5: 
          drawable = this.getResources().getDrawable(R.drawable.icon05); 
          break; 
         case 6: 
          drawable = this.getResources().getDrawable(R.drawable.icon06); 
          break; 
         case 7: 
          drawable = this.getResources().getDrawable(R.drawable.icon07); 
          break; 
         case 0: 
          drawable = this.getResources().getDrawable(R.drawable.icon00); 
          break; 
         default: 
          drawable = this.getResources().getDrawable(R.drawable.icon01); 
          break; 
        } 


       itemizedoverlay = new MapItemizedOverlay(drawable,this); 

       //geoPoint 
       GeoPoint point = new GeoPoint((int) (site.getLatitude() * 1E6), (int) (site.getLongitude() * 1E6)); 

       //item 
       OverlayItem overlayitem = new OverlayItem(point, String.valueOf(site.getId()), null); 

       itemizedoverlay.addOverlay(overlayitem); 

       } 

       //add to map 
       mapOverlays.add(itemizedoverlay); 

       mapView.invalidate(); 

      }catch(Exception e){ 
       Log.e(TAG,e.getMessage()); 
      } 

} 
+0

修正しましたか? PhoneGapとGoogle Mapsを使用して同様の問題が発生しました。 – Sebastian

+1

すべての類似したアイコンを1つのMapItemizedOverlayに配置し、完全に機能しました。あなたはそれを修正しましたか? – johann

+0

ああ、これはGoogle Maps APIのネイティブバージョンを使用している場合にのみ有効です。 JavascriptのGoogle Maps APIでこれを使用する可能性はありませんか? – Sebastian

関連する問題