2013-12-10 3 views
1

Может кто-нибудь объяснить мне comment here:Как анонимный класс получит GC'd в picasso на Android?

Не создавать анонимный класс Target при вызове Пикассо, как можно получить мусора. Держите член поле в качестве сильной ссылки предотвратить его gc'ed

Per line 30 of 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; 
    } 

Предполагая, что обратный вызов является анонимный класс, было бы создать ссылку на родительский класс, тем самым предотвращая родителю быть GC'd тоже.

Per line 48 of Action.java, цель сама по себе является слабым, но это не обратный вызов.

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

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

+1

Кто-то должен содержать ссылку на ваш «Целевой», иначе он получит gc'ed, потому что Picasso хранит в нем «WeakReference». – dnkoutso

+0

А, я вижу - ваш комментарий применяется только к цели, а не к обратному вызову. Нужно ли использовать анонимные обратные вызовы, да? – esilver

+0

Да, анонимные обратные вызовы сохраняются в качестве сильной ссылки. Рекомендуется, чтобы вы вызывали 'cancel (target)', чтобы освободить ссылку и предотвратить временную утечку, пока загрузка Picasso не завершится. – dnkoutso

ответ

0

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

 Смежные вопросы

  • Нет связанных вопросов^_^