В моей функции:
public void getPointMarkerFromUrl(final String url, final OnBitmapDescriptorRetrievedListener listener) {
final int maxSize = context.getResources().getDimensionPixelSize(R.dimen.icon_max_size);
Target t = new Target() {
@Override
public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
if (bitmap != null)
listener.bitmapRetrieved(getBitmapDescriptorInCache(url, bitmap));
else
loadDefaultMarker(listener);
}
@Override
public void onBitmapFailed(Drawable errorDrawable) {
loadDefaultMarker(listener);
}
@Override
public void onPrepareLoad(Drawable placeHolderDrawable) {
}
};
Picasso.with(context)
.load(url)
.resize(maxSize, maxSize)
.into(t);
}
OnBitmapLoaded () никогда не вызывается при первой загрузке изображений. Я читал какую-то тему вроде https://github.com/square/picasso/issues/39, в которой рекомендуется использовать метод fetch (Target t) (похоже, проблема слабой ссылки ...), но эта функция недоступен в последней версии Picasso (2.3.2). У меня есть только метод fetch (), но я не могу использовать его в (mytarget) одновременно
Не могли бы вы объяснить мне, как использовать fetch () с настраиваемой целью? Спасибо.
Документ: http://square.github.io/picasso/javadoc/com/squareup/picasso/RequestCreator.html#fetch--
Ответы:
Как отметили другие респонденты (@lukas и @mradzinski), Пикассо сохраняет лишь слабую ссылку на
Target
объект. Хотя вы можете хранить сильную ссылкуTarget
в одном из ваших классов, это все равно может быть проблематично, еслиTarget
ссылкиView
каким-либо образом, поскольку вы, по сути, также сохраните сильную ссылку на негоView
(что является одной из вещей, которые Пикассо явно помогает избежать).Если вы попали в такую ситуацию, я бы рекомендовал добавить тег
Target
кView
:Такой подход позволяет Пикассо делать все за вас. Он будет управлять
WeakReference
объектами для каждого из ваших представлений - как только один из них больше не нужен, любаяTarget
обработка изображения также будет выпущена, поэтому вы не застрянете с утечками памяти из-за долгоживущих целей, но ваша цель будет длиться пока жив его взгляд.источник
Picasso не имеет сильной ссылки на объект Target, поэтому он собирает мусор и
onBitmapLoaded
не вызывается.Решение довольно простое, просто сделайте сильную ссылку на
Target
.источник
View
орудиеTarget
.Object.equals(Object)
иObject.hashCode()
методы. у вас есть рабочий образец?Если бы у меня был ImageView, я бы просто сделал вот так: imageView.setTag (target);
Я использую следующее решение для загрузки растровых изображений в уведомления, поэтому мне нужно только растровое изображение.
Итак, команда create Set будет хранить целевые объекты и удалять их по окончании загрузки.
источник
источник
Вот решение для тех, кто не использует представление. Этот вспомогательный метод использует список для временного хранения целевого объекта до тех пор, пока не будет возвращен результат, чтобы он не был gc'd:
источник
Как сказал @lukas (и цитирует), Пикассо не имеет сильной ссылки на объект Target. Чтобы избежать сборки мусора, вы должны иметь сильную ссылку на объект.
О методе fetch (). В документации довольно ясно, что fetch () не должен использоваться с ImageView или Target, он просто «разогревает» кеш и ничего больше, поэтому вы не сможете использовать его так, как вы хотеть.
Я рекомендую вам иметь сильную ссылку, например, объяснил @lukas, она должна работать. Если нет, пожалуйста, откройте новую проблему на странице проекта GitHub.
источник
Я столкнулся с аналогичной проблемой, и ссылка на цель совершенно не помогла, поэтому я использовал следующий код, который возвращает Bitmap:
на нижней стороне -> нет обратного вызова, и вы не можете вызвать эту функцию в основном потоке, вам нужно запустить эту функцию в фоновом потоке, как в следующем примере:
Еще одна вещь, которая работает намного лучше, - это просто использовать Glide!
Мне нужно было использовать оба из них, поскольку целью моего проекта было использование двух разных api для загрузки изображений, чтобы показать галерею изображений и дать пользователю возможность выбрать, какой api использовать.
Должен сказать, я был поражен результатами, API Glide работал безупречно во всех аспектах (цель Glide не имеет слабых ссылок), а Пикассо устроил мне ад (это был мой первый раз, когда я использовал Glide, до сих пор я обычно использовал Пикассо, похоже, что сегодня это изменится ^^).
источник
Я столкнулся с той же проблемой, но когда я изменил зависимость, как указано ниже, теперь она работает правильно.
источник