我的应用在地图上有大约1,500个标记,这些标记通过群集显示,以免超载应用程序。这些书签目前显示为BitmapDescriptorFactory.defaultMarker()
但是,当我修改每个点的代码以显示带有标记值的自定义位图时,只有少数设备出现此错误,其中包括LG K10 LTE和一些Motorolas。大多数电器正常工作。
当我使用此功能时,在我完成渲染所有1500个标记之前,它会因以下错误而崩溃:
"无法分配重复blob fd。"
在研究这个错误时,在我看来这是一个内存溢出,我应该将这些标记存储在LRU缓存中,但是我无法与集群一起执行此操作。
有没有人有这个或者您是否有想法/建议来解决这个问题?
以下是位图呈现器代码段:
public class OwnRendring extends DefaultClusterRenderer<MyItem> {
OwnRendring(Context context, GoogleMap map, ClusterManager<MyItem> clusterManager) {
super(context, map, clusterManager);
}
protected void onBeforeClusterItemRendered(MyItem item, MarkerOptions markerOptions) {
markerOptions.snippet(item.getSnippet());
markerOptions.title(item.getTitle());
markerOptions.anchor(0.33f, 1f);
markerOptions.infoWindowAnchor(0.33f,0f);
int cor = (item.getPublico() ? cfgCorPostoPublico : cfgCorPostoPrivado);
String preço = item.getTitle().substring(item.getTitle().length() - 5);
markerOptions.icon(BitmapDescriptorFactory.fromBitmap(createMarker(preço, cor)));
super.onBeforeClusterItemRendered(item, markerOptions);
}
protected boolean shouldRenderAsCluster(Cluster cluster) {
return cfgCluster && cluster.getSize() >= cfgClusterMin;
}
}
@Override
public void onCameraIdle() {mClusterManager.cluster();}
private Bitmap createMarker(String text, int color) {
View markerLayout = getLayoutInflater().inflate(R.layout.custom_marker, null);
ImageView markerImage = markerLayout.findViewById(R.id.marker_image);
TextView markerRating = markerLayout.findViewById(R.id.marker_text);
markerImage.setImageResource(R.drawable.pin_shadow);
markerImage.clearColorFilter();
markerImage.getDrawable().mutate().setColorFilter(color, PorterDuff.Mode.MULTIPLY );
markerRating.setText(text);
markerLayout.measure(
View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
markerLayout.layout(0, 0, markerLayout.getMeasuredWidth(), markerLayout.getMeasuredHeight());
final Bitmap bitmap = Bitmap.createBitmap(
markerLayout.getMeasuredWidth(),
markerLayout.getMeasuredHeight(),
Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
markerLayout.draw(canvas);
return bitmap;
}
答案 0 :(得分:0)
或者,我通过减少标记渲染来解决我的问题,如下所示:
我修改代码以强制群集所有标记,除了屏幕上可见的那些标记。
为此,我必须导入和修改maps-utils库的原始代码,因为渲染只发生在放大或缩小后,而不是在地图移动后渲染。
public class OwnRendring extends DefaultClusterRenderer<MyItem> {
OwnRendring(Context context, GoogleMap map, ClusterManager<MyItem> clusterManager) {
super(context, map, clusterManager);
}
protected void onBeforeClusterItemRendered(MyItem item, MarkerOptions markerOptions) {
... original code ...
}
protected boolean shouldRenderAsCluster(Cluster cluster) {
boolean isInBounds = latLngBounds.contains(cluster.getPosition());
return !isInBounds || (cfgCluster && cluster.getSize() >= cfgClusterMin);
}
}
@Override
public void onCameraIdle() {
mClusterManager.cluster();
latLngBounds = mMap.getProjection().getVisibleRegion().latLngBounds;
}
并且在库maps-utils( 类DefaultClusterRenderer )中,我对这些行进行了注释,因为当用户移动地图时,它们返回时没有渲染簇:
@SuppressLint("NewApi")
public void run() {
// if (clusters.equals(DefaultClusterRenderer.this.mClusters)) {
// mCallback.run();
// return;
// }
... original code ...
}
显然,这不是我的问题的正确答案,但对于遇到此问题的人来说,它可能是一个有效的替代方案,到目前为止还没有确定的答案。
***请有人在语法上纠正我的答案,因为英语不是我的母语。