无法分配dup blob fd

时间:2017-11-03 00:13:56

标签: android google-maps bitmap marker

Imagem com os bitmaps personalizados renderizados

我的应用在地图上有大约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;
}

1 个答案:

答案 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 ...

        }

显然,这不是我的问题的正确答案,但对于遇到此问题的人来说,它可能是一个有效的替代方案,到目前为止还没有确定的答案。

***请有人在语法上纠正我的答案,因为英语不是我的母语。