Meine App zuteilen haben rund 1.500 Markierungen auf einer Karte, die durch Cluster gezeigt werden, um nicht die Anwendung zu überlasten. Diese Lesezeichen werden derzeit als BitmapDescriptorFactory.defaultMarker() angezeigt. Wenn ich jedoch den Code für jeden Punkt so ändere, dass ein benutzerdefiniertes Bitmap mit Werten auf den Markierungen angezeigt wird, haben nur wenige Geräte diesen Fehler, darunter LG K10 LTE und einige Motorolas. Die meisten Geräte funktionieren normal.
Wenn ich diese Funktion verwenden, bevor ich Rendering all 1500 Marker beenden, stürzt es mit dem folgenden Fehler: „Kann nicht dup blob fd zuteilen“
In Forschung zu diesem Fehler scheint es mir, dass dies ein Speicherüberlauf ist und dass ich diese Markierungen im LRU-Cache speichern sollte, aber ich bin nicht in der Lage, dies in Verbindung mit den Clustern zu tun.
Hat jemand dieses oder hatte Sie eine Idee/Vorschlag, um dieses Problem zu lösen?
Die folgenden der Renderer Code-Schnipsel Bitmaps ist:
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;
}