2016-06-20 8 views
1

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()のように使用する必要はありません彼らは必要ではなく、アプリの目的に合っていません。

答えて

5

私は同様の問題が発生しましたが、ターゲットへの参照はまったく役に立ちませんでした。

私のプロジェクトの目的は、イメージギャラリーを表示し、ユーザーにどのAPIを使用するかを選択させる2つの異なるイメージダウンロードapiを使用することでした。

ピカソの横に私はグライドを使用しましたが、私は結果に驚いていました。グライドのアピはピカソが私に地獄を与えたときに完璧に働いていました(グライドを初めて使ったとき、変わるつもりです^^)。

だから、あなたに私の提案は次のとおりです。

  1. 使用ピカソ(そのターゲットにそのような弱参照)上を滑ります。
  2. 私はそれはあなたを助ける場合、ハンドラ、わからないで、私は()GETを使用して終了両方のライブラリを使用する必要がありましたが、それは私の問題は解決するので:私の一日

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

を保存します。これをRxJavaと組み合わせることができます – gorodechnyj

関連する問題