0

I'm creating dynamic map marker in my android app, but I sometimes I got OutOfMemoryError and IllegalArgumentExceptionthat have an identical logcat error. Here is my code to draw multiple marker

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());
        }
    }

and this is the logcat error

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)

Is anybody experiencing this? I will appreciate any help. Thank you.

Raditya Kurnianto
  • 734
  • 1
  • 16
  • 42

1 Answers1

0

You do a lot of bitmap copies for every marker, why not put these lines before for(), and use same bitmap and style for markers ?

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

And you even create new Layer for each Marker, so please put also these lines before for():

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

So the code would be:

    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());
        }
    }
JaakL
  • 4,107
  • 5
  • 24
  • 37