当地图上有太多标记时,我的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()
是在执行此行之后放置的。所以我不知道该怎么办了!预先感谢您的帮助。如果缺少一些重要的代码,我可以添加它们。