谷歌地图 - 内存泄漏与动态位图标记

时间:2017-10-24 13:08:14

标签: java android google-maps memory-leaks

我的应用使用geojson在地图上绘制功能。绘制功能:

for (GeoJsonFeature f : new GeoJsonLayer(googleMap, new JSONObject(geojson)).getFeatures())
{
  f.setPointStyle(getPointStyle(text,status);
  layer.addFeature(f);
}
layer.addLayerToMap();

生成点(标记)样式并设置图标:

GeoJsonPointStyle markerStyle = new GeoJsonPointStyle();
int[] markers = {R.drawable.marker0,R.drawable.marker1,R.drawable.marker2,R.drawable.marker3,R.drawable.marker4};
bmp = Utils.drawTextToBitmap(getContext(), markers[status], icon);
markerStyle.setIcon(highlighted ? BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_GREEN):BitmapDescriptorFactory.fromBitmap(bmp));

drawTextToBitmap只生成包含文字的位图:

public static Bitmap drawTextToBitmap(Context gContext, int gResId, String gText)
    {
        Resources resources = gContext.getResources();
        float scale = resources.getDisplayMetrics().density;
        Bitmap bitmap = BitmapFactory.decodeResource(resources, gResId);

        android.graphics.Bitmap.Config bitmapConfig = bitmap.getConfig();
        if (bitmapConfig == null)
        {
            bitmapConfig = android.graphics.Bitmap.Config.ARGB_8888;
        }

        bitmap = bitmap.copy(bitmapConfig, true);

        Canvas canvas = new Canvas(bitmap);
        Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
        paint.setColor(Color.WHITE);
        paint.setTextSize((int) (18 * scale));
        Typeface tf = Typeface.createFromAsset(gContext.getAssets(), "fonts/fontawesome.ttf");
        paint.setTypeface(Typeface.create(tf, Typeface.BOLD));
        paint.setShadowLayer(1f, 0f, 1f, Color.WHITE);

        Rect bounds = new Rect();
        paint.getTextBounds(gText, 0, gText.length(), bounds);
        int x = (bitmap.getWidth() - bounds.width()) / 2;
        int y = (bitmap.getHeight() + bounds.height()) / 2 -8;

        canvas.drawText(gText, x, y, paint);

        return bitmap;
    }

我的问题是,在某些手机上(不是在每部手机上),如果在地图上绘制大量标记,这种方法会导致巨大的内存泄漏。如果我使用静态标记从资源中绘制,则问题不存在,但我需要动态位图来在其上添加文本。

你对内存泄漏原因有什么看法吗?似乎map保存位图引用,因此它可以防止垃圾处理它。即使地图片段被破坏,地图资源也永远不会被释放,因此在几次显示地图后,由于OutOfMemory异常,app停止工作。

0 个答案:

没有答案
相关问题