Как анонимный класс получит GC'd в picasso на Android?

Может ли кто-нибудь объяснить мне комментарий здесь:

Не создавайте анонимный класс Target при вызове Picasso, так как это может привести к сборке мусора. Сохраняйте поле участника в качестве надежной ссылки, чтобы предотвратить его сборку.

Согласно строке 30 ImageViewAction. .java, этот обратный вызов является сильной ссылкой.

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

Предполагая, что обратный вызов является анонимным классом, он создаст ссылку на его родительский класс, тем самым предотвратив сборку родительского объекта.

Согласно строке 48 действия. .java, сама цель является 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);

Может кто-нибудь объяснить, что я неправильно понимаю?


person esilver    schedule 10.12.2013    source источник
comment
Кто-то должен хранить ссылку на ваш Target, в противном случае он получит gc'ed, потому что Пикассо хранит в нем только WeakReference.   -  person dnkoutso    schedule 11.12.2013
comment
А, я вижу - ваш комментарий относился только к цели, а не к обратному вызову. Тогда должно быть нормально использовать анонимные обратные вызовы, да?   -  person esilver    schedule 11.12.2013
comment
Да, анонимные обратные вызовы хранятся как сильная ссылка. НАСТОЯТЕЛЬНО рекомендуется вызвать cancel(target), чтобы освободить ссылку и предотвратить временную утечку, пока не завершится загрузка Picasso.   -  person dnkoutso    schedule 11.12.2013


Ответы (1)


Я был сбит с толку, и комментарий относился к цели (ImageView), а не к обратному вызову. Шаблон использования анонимного обратного вызова прекрасен.

person esilver    schedule 11.12.2013