2014-11-06 57 views
0

我在我的android應用程序中創建動態地圖標記,但有時我得到了OutOfMemoryErrorIllegalArgumentException,它們具有相同的logcat錯誤。這裏是我的代碼來繪製多個標記在nutiteq上繪製標記時位圖大小超過32位

for (int i = 0; i < lats.size(); i++) { 
     // draw marker 
     Bitmap markerBitmap = UnscaledBitmapLoader.decodeResource(getResources(), R.drawable.ic_place); 
     MarkerStyle markerStyle = MarkerStyle.builder().setBitmap(markerBitmap).setSize(0.5f).setColor(Color.RED).build(); 

     // define custom label 
     try { 
      Label markerLabel = new DefaultLabel("", data.get(i)); 
      // define map location marker, convert to base map coordinate 
      MapPos position = maplayer.getProjection().fromWgs84(Double.parseDouble(lngs.get(i)), Double.parseDouble(lats.get(i))); 

      // add marker to the current map layer 
      markerLayer = new MarkerLayer(maplayer.getProjection()); 
      marker = new Marker(position, markerLabel, markerStyle, markerLayer); 
      markerLayer.add(marker); 
      mapView.getLayers().addLayer(markerLayer); 
     } catch (Exception e) { 
      Log.d("Error Marker", e.getMessage() + " " + e.getCause()); 
     } catch (OutOfMemoryError e){ 
      Toast.makeText(getApplicationContext(), "OutOfMemory " + e.getMessage() + " " + e.getCause(), Toast.LENGTH_LONG).show(); 
      Log.d("OutOfMemory", e.getMessage() + " " + e.getCause()); 
     } 
    } 

,這是logcat的錯誤

11-05 18:16:18.340 28622-28694/kolek.com.kolekin E/AndroidRuntime? FATAL EXCEPTION: GLThread 657 
java.lang.IllegalArgumentException: bitmap size exceeds 32bits 
     at android.graphics.Bitmap.nativeCreate(Native Method) 
     at android.graphics.Bitmap.createBitmap(Bitmap.java:669) 
     at android.graphics.Bitmap.createBitmap(Bitmap.java:649) 
     at com.nutiteq.ui.Label.getTextureInfo(Label.java:77) 
     at com.nutiteq.ui.DefaultLabel.drawMarkerLabel(DefaultLabel.java:153) 
     at com.nutiteq.renderers.MapRenderer3D.updateLabel(MapRenderer3D.java:484) 
     at com.nutiteq.renderers.MapRenderer3D.onDrawFrame(MapRenderer3D.java:358) 
     at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1516) 
     at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1240) 

11-05 18:29:03.630 32187-32423/kolek.com.kolekin E/AndroidRuntime? FATAL EXCEPTION: GLThread 559 
java.lang.OutOfMemoryError 
     at android.graphics.Bitmap.nativeCreate(Native Method) 
     at android.graphics.Bitmap.createBitmap(Bitmap.java:669) 
     at android.graphics.Bitmap.createBitmap(Bitmap.java:649) 
     at com.nutiteq.ui.Label.getTextureInfo(Label.java:77) 
     at com.nutiteq.ui.DefaultLabel.drawMarkerLabel(DefaultLabel.java:153) 
     at com.nutiteq.renderers.MapRenderer3D.updateLabel(MapRenderer3D.java:484) 
     at com.nutiteq.renderers.MapRenderer3D.onDrawFrame(MapRenderer3D.java:358) 
     at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1516) 
     at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1240) 

是否有人遇到這個?我會感謝任何幫助。謝謝。

回答

0

你爲每個標記做了很多位圖副本,爲什麼不把這些行放在for()之前,並且爲標記使用相同的位圖和樣式?

 Bitmap markerBitmap = UnscaledBitmapLoader.decodeResource(getResources(), R.drawable.ic_place); 
     MarkerStyle markerStyle = MarkerStyle.builder().setBitmap(markerBitmap).setSize(0.5f).setColor(Color.RED).build(); 

你甚至每個標記創建新的圖層,所以請之前也把這些線():

 markerLayer = new MarkerLayer(maplayer.getProjection()); 
    mapView.getLayers().addLayer(markerLayer); 

因此,代碼是:

Bitmap markerBitmap = UnscaledBitmapLoader.decodeResource(getResources(), R.drawable.ic_place); 
    MarkerStyle markerStyle = MarkerStyle.builder().setBitmap(markerBitmap).setSize(0.5f).setColor(Color.RED).build(); 

    markerLayer = new MarkerLayer(maplayer.getProjection()); 
    mapView.getLayers().addLayer(markerLayer); 

    for (int i = 0; i < lats.size(); i++) { 
     // draw marker 
     // define custom label 
     try { 
      Label markerLabel = new DefaultLabel("", data.get(i)); 
      // define map location marker, convert to base map coordinate 
      MapPos position = maplayer.getProjection().fromWgs84(Double.parseDouble(lngs.get(i)), Double.parseDouble(lats.get(i))); 

      // add marker to the current map layer 
      marker = new Marker(position, markerLabel, markerStyle, markerLayer); 
      markerLayer.add(marker); 
     } catch (Exception e) { 
      Log.d("Error Marker", e.getMessage() + " " + e.getCause()); 
     } catch (OutOfMemoryError e){ 
      Toast.makeText(getApplicationContext(), "OutOfMemory " + e.getMessage() + " " + e.getCause(), Toast.LENGTH_LONG).show(); 
      Log.d("OutOfMemory", e.getMessage() + " " + e.getCause()); 
     } 
    }