2016-06-20 6 views
1

Guten Tag.Ich habe eine Google-Map mit Cluster-Manager.Einfach, wo ich den Cluster zum Zeichnen von Markern gruppiert oder nicht verwenden.Wie auch immer ich einen Methodenrückruf von Cluster-Manager, die das Cluster Element ist rendern.Innerhalb dieses Callbacks verwende ich ein benutzerdefiniertes Bild auf den Marker: Das Benutzerbild innerhalb des Markers.Ich fand Picasso am besten, um Bitmap-Laden zu handhaben und gleichzeitig bekam ich viele Kopfschmerzen. Ich verwende Target Klasse von Picasso Um die Bitmap-Callbacks zu initiieren: OnPreLoad,OnFail,OnBitmapLoaded. Das Problem ist, dass auf dem ersten Cluster-Element die onBitmapLoaded nicht aufgerufen und im Allgemeinen wird es nie aufgerufen, es sei denn, es wurde zum zweiten Mal berührt. Beim ersten Mal passiert nichts außer OnPreLoad und durch googeln ich fand, dass der große Picasso schwacher Verweis auf die Klasse hält. Ich versuchte a ll die Beispiele der Google: Herstellung der Zielreferenz stark (die initialazation der Klasse von Verfahren bekommen und init die Klasse in meiner Klasse wie die folgt)Picasso Ziel wurde Müll gesammelt

@Override 
protected void onClusterItemRendered(MarkerItem clusterItem, Marker marker) { 
    mMarker = marker; 
    mMarkerItem = clusterItem; 

    Picasso.with(mContext).load(clusterItem.getImageUrl()).transform(new CircleTransformation()).into(target); 
} 



private Target target = new Target() { 
    @Override 
    public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) { 
     Log.d(TAG, "onBitmapLoaded: "); 
    } 

    @Override 
    public void onBitmapFailed(Drawable errorDrawable) { 
     Log.d(TAG, "onBitmapFailed: "); 
    } 

    @Override 
    public void onPrepareLoad(Drawable placeHolderDrawable) { 
     Log.d(TAG, "onPrepareLoad: "); 
    } 
}; 
@Override 
protected void onBeforeClusterItemRendered(MarkerItem item, MarkerOptions markerOptions) { 
    markerOptions.title(item.getTitle()); 
    markerOptions.icon(item.getIcon()); 
} 

An dieser Stelle bekommen ich das gleiche Ergebnis .... manchmal ist die Bitmap geladen und manchmal not.Mostly nicht ... auf jeden Fall habe ich versucht, die Interface-Klasse zu meiner eigenen Klasse zu implementieren, wie folgt:

public class PicassoMarkerView implements com.squareup.picasso.Target { 
private static final String TAG = "MarkerRender"; 
private Bitmap mMarkerBitmap; 
private ClusterManager<MarkerItem> mClusterManager; 
private MarkerItem mMarkerItem; 
private Marker mMarker; 

public PicassoMarkerView() { 

} 


@Override 
public int hashCode() { 
    return mMarker.hashCode(); 
} 

@Override 
public boolean equals(Object o) { 
    if (o instanceof PicassoMarkerView) { 
     Marker marker = ((PicassoMarkerView) o).mMarker; 
     return mMarker.equals(marker); 
    } else { 
     return false; 
    } 
} 


@Override 
public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) { 
    Bitmap scaledBitmap = Bitmap.createScaledBitmap(bitmap, 
      mMarkerBitmap.getWidth() - 15, (int) (mMarkerBitmap.getHeight()/1.5 - 15), 
      false); 
    mMarker.setIcon(BitmapDescriptorFactory.fromBitmap(overlay(mMarkerBitmap, scaledBitmap, 8, 7))); 
    Log.d(TAG, "onBitmapLoaded: "); 
} 

@Override 
public void onBitmapFailed(Drawable errorDrawable) { 
    Log.d(TAG, "onBitmapFailed: "); 
} 

@Override 
public void onPrepareLoad(Drawable placeHolderDrawable) { 
    Log.d(TAG, "onPrepareLoad: "); 
} 


private Bitmap overlay(Bitmap bitmap1, Bitmap bitmap2, int left, int top) { 
    Bitmap res = Bitmap.createBitmap(bitmap1.getWidth(), bitmap1.getHeight(), 
      bitmap1.getConfig()); 

    Canvas canvas = new Canvas(res); 

    canvas.drawBitmap(bitmap1, new Matrix(), null); 
    canvas.drawBitmap(bitmap2, left, top, null); 

    return res; 
} 


public void setMarkerBitmap(Bitmap markerBitmap) { 
    this.mMarkerBitmap = markerBitmap; 
} 

public void setClusterManager(ClusterManager<MarkerItem> clusterManager) { 
    this.mClusterManager = clusterManager; 
} 

public void setMarkerItem(MarkerItem markerItem) { 
    this.mMarkerItem = markerItem; 
} 

public void setMarker(Marker marker) { 
    this.mMarker = marker; 
} 

}

Unfortunatally dies auch nicht funktioniert .. .Same result ... Also bitte e liebe freunde kannst du mir ein funktionierendes beispiel dafür geben? soweit ich googlen konnte, passiert das problem meistens dem benutzer, der versucht, diese interne schleife zu machen und meine onClusterItemRender irgendeine art von schleife lässt sagen, wie sie jedes mal ausgelöst wird ist sichtbar für Benutzer, also yeah es wird mehrmals ausgelöst und so schnell wie Schleife so geben Sie mir eine Idee bitte und helfen Sie mir ...

Wichtig zu erwähnen, dass ich nicht Methoden von Picasso wie fetch(),get() als verwenden müssen Sie sind nicht notwendig und entsprechen nicht dem Zweck der App.

Antwort

5

Ich stieß auf ähnliche Problem und Halte Bezug auf das Ziel hat überhaupt nicht geholfen.

Der Zweck meines Projekts war es, 2 verschiedene Bild-Download-APIs zu verwenden, um eine Bildergalerie anzuzeigen und dem Benutzer die Möglichkeit zu geben, welche API zu verwenden.

Neben Picasso habe ich Glide verwendet, und ich war erstaunt über die Ergebnisse, Glides Api funktionierte tadellos in jeder Hinsicht, während Picasso mir die Hölle gab (das war das erste Mal mit Glide, ich benutzte Picasso bisher, scheint heute) werde mich ändern ^^).

So Ihnen mein Vorschlag ist:

  1. Verwenden gleiten über Picasso (keine solche schwachen Verweis auf ihr Ziel).
  2. Da musste ich beide Bibliotheken verwenden I get() in einem Handler am Ende, nicht sicher, ob es Ihnen helfen wird, aber es mein Problem gelöst:

handlerThread = new HandlerThread(HANDLER_THREAD_NAME); 
handlerThread.start(); 

Handler handler = new Handler(handlerThread.getLooper()); 
handler.post(new Runnable() { 
    @Override 
    public void run() { 
     Bitmap bitmap = null; 
     try { 
      bitmap = picasso.with(appContext).load(url).get(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     }finally { 
      if (bitmap != null) { 
       //do whatever you wanna do with the picture. 
       //for me it was using my own cache 
       imageCaching.cacheImage(imageId, bitmap); 
      } 
     } 
    } 
}); 
+0

meinen Tag gerettet. Jetzt kann ich das mit RxJava kombinieren – gorodechnyj