Good day.Iはクラスターマネージャーのグーグルマップを持っています。シンプルな1つで、私はグループ化されたマーカーを描画するためにクラスターを使用します。そのコールバックの中で私はマーカーにカスタム画像を適用しています:マーカー内のユーザー画像。ピカソがビットマップの読み込みを処理するのに最適であると同時に頭痛をたくさん感じました。ピカソのTarget
クラスを使用していますビットマップコールバックを開始する:OnPreLoad,OnFail,OnBitmapLoaded
。最初のクラスタアイテムのレンダリングではonBitmapLoaded
が呼び出されず、2度目にタッチされないと呼び出されません。最初に何も起こらず、OnPreLoad
を除くコールバックはトリガーされません。私はグーグルピカソがクラスに弱い参照を保持していることがわかった。私はLLグーグルの例:ターゲット参照が強い(メソッドのうちのクラスのinitialazationを取得し、次のように私のクラス内のクラスを初期化)を作る。この時点でPicasso Targetはガベージコレクトされました
@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());
}
iは、同じ結果を得る....時々、ビットマップがロードされ、時にはnot.Mostly ... は、とにかく、私は次のように自分のクラスにインタフェースクラスを実装しようとしていません:
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、これはどちらか動作していません。..同じ結果です...親愛なる友人は私にこれの実例を教えてもらえますか?私がグーグルでできる限り、問題は主にループ内でこれをやろうとするユーザに起こります。onClusterItemRender
ループのある種のことは、ユーザーの目に見えますので、何度もループのように速くトリガーされますので、いくつかのアイデアをお願いしてください...
私はピカソのメソッドをfetch(),get()
のように使用する必要はありません彼らは必要ではなく、アプリの目的に合っていません。
を保存します。これをRxJavaと組み合わせることができます – gorodechnyj