2017-11-03 4 views
1

Imagem com os bitmaps personalizados renderizadoskonnte nicht dup blob fd

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; 
} 

Antwort

0

Alternativ löste ich mein Problem, indem die Markierungen zu reduzieren wie folgt zu machen:

ich den Code ändern Cluster alle Marker zu zwingen, mit Ausnahme derjenigen, das sind auf dem Bildschirm sichtbar.

Dazu musste ich den Originalcode der maps- utils-Bibliothek importieren und modifizieren, da das Rendern nur nach dem Einzoomen oder Auszoomen erfolgte, nicht nach dem Verschieben der Karte.

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; 
} 

und in der Bibliothek Karten-utils (Klasse DefaultClusterRenderer) i diese Zeilen kommentiert, weil sie ohne Cluster machen kehrt, wenn der Benutzer die Karte bewegt:

 @SuppressLint("NewApi") 
     public void run() { 
//   if (clusters.equals(DefaultClusterRenderer.this.mClusters)) { 
//    mCallback.run(); 
//    return; 
//   } 

       ... original code ... 

     } 

dies nicht offensichtlich ist die richtige Antwort auf meine Frage, aber es kann eine gültige Alternative für jeden sein, der dieses Problem hat, bisher ohne eine schlüssige Antwort.

*** Bitte jemand grammatisch korrigieren meine Antwort, weil Englisch nicht meine Muttersprache ist.

Verwandte Themen