1

誰かがここでコメントを説明してくれますか:

ガベージ コレクションが発生する可能性があるため、Picasso を呼び出すときに Target の匿名クラスを作成しないでください。メンバー フィールドを強力な参照として保持し、GC されないようにする

ImageViewAction.javaの 30 行目で、その Callback は強い参照です。

ImageViewAction(Picasso picasso, ImageView imageView, Request data, boolean skipCache,
      boolean noFade, int errorResId, Drawable errorDrawable, String key, Callback callback) {
    super(picasso, imageView, data, skipCache, noFade, errorResId, errorDrawable, key);
    this.callback = callback;
  }

Callback が匿名クラスであると仮定すると、その親クラスへの参照が作成されるため、親も GC されるのを防ぐことができます。

Action.javaの 48 行目によると、ターゲット自体は WeakReference ですが、それはコールバックではありません。

  Action(Picasso picasso, T target, Request data, boolean skipCache, boolean noFade,
      int errorResId, Drawable errorDrawable, String key) {
    this.picasso = picasso;
    this.data = data;
    this.target = new RequestWeakReference<T>(this, target, picasso.referenceQueue);

誰かが私が誤解していることを説明できますか?

4

1 に答える 1

0

私は混乱し、コメントはコールバックではなくターゲット(ImageView)を参照していました。匿名の Callback を使用するパターンは問題ありません。

于 2013-12-11T05:33:13.693 に答える