动态标记Google Maps - OutOfMemoryError

时间:2018-02-11 18:28:58

标签: android google-maps bitmap google-maps-markers google-maps-api-2

当地图上有太多标记时,我的Google地图存在内存问题:OutOfMemoryError。从我在互联网上看到的,它是一个问题的位图。位图(彼此不同)是动态生成的。

以下是我的每个动态位图的代码:

LayoutInflater inflater = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
final View inflatedFrame = inflater.inflate(R.layout.friend_layout_map, null);
final FrameLayout frameLayout = (FrameLayout) inflatedFrame.findViewById(R.id.friend);

/** customizing the view **/

frameLayout.setDrawingCacheEnabled(true);
frameLayout.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
                View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
frameLayout.layout(0, 0, frameLayout.getMeasuredWidth(), frameLayout.getMeasuredHeight());
frameLayout.buildDrawingCache(true);
Bitmap bm = Bitmap.createBitmap(frameLayout.getMeasuredWidth(), frameLayout.getMeasuredHeight(),
Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bm);
canvas.drawColor(Color.WHITE, PorterDuff.Mode.SRC_IN);
Drawable drawable = frameLayout.getBackground();
if (drawable != null)
    drawable.draw(canvas);
frameLayout.draw(canvas);

然后,使用每个位图:

@Override protected void onBeforeClusterItemRendered(Map_frag.Map_Cluster item, MarkerOptions markerOptions)
{
        markerOptions.icon(BitmapDescriptorFactory.fromBitmap(item.bm));
        /** item.bm is bm in the previous code extract **/
}

当有20个标记时,这一切都很有效。但是,例如,只要有50,就会出现OutOfMemoryError

所以我尝试了几种解决方案:

  • 启用largeHeap到清单。这似乎允许在应用程序崩溃之前添加一些标记。但很快,错误再次发生。
  • 使用以下代码释放每个位图使用的内存:markerOptions.icon(BitmapDescriptorFactory.fromBitmap(item.bm)); bm.recycle(); bm = null; 但它不起作用。行markerOptions.icon(BitmapDescriptorFactory.fromBitmap(item.bm));崩溃说位图不能是循环位图。很奇怪,因为bm.recycle()是在执行此行之后放置的。

所以我不知道该怎么办了!预先感谢您的帮助。如果缺少一些重要的代码,我可以添加它们。

0 个答案:

没有答案