在第一次加载时未调用的Target对象的onBitmapLoaded在我的功能: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)方法(这似乎是弱引用的问题......),但是这个函数在毕加索的最后一个版本(2.3.2)中没有。我只有一个fetch()方法,但我不能同时使用(mytarget)你能解释一下如何使用fetch()和自定义Target吗?谢谢。Doc:http://square.github.io/picasso/javadoc/com/squareup/picasso/RequestCreator.html#fetch--
3 回答
慕少森
TA贡献2019条经验 获得超9个赞
正如其他受访者(@lukas和@mradzinski)所指出的那样,毕加索只对该Target
对象保持弱引用。虽然你可以在你的Target
一个类中存储一个强引用,但是如果以任何方式Target
引用a ,这仍然会有问题View
,因为你也有效地保持对它的强引用View
(这是毕加索的事情之一)明确帮助你避免)。
如果您处于这种情况,我建议将标记标记Target
为View
:
final ImageView imageView = ... // The view Picasso is loading an image intofinal Target target = new Target{...};imageView.setTag(target);
这种方法的好处是让毕加索能够为您处理一切。它将管理WeakReference
每个视图的对象 - 只要不再需要一个,Target
对图像也将被释放的任何处理,所以你不会因长期目标而陷入内存泄漏,但你的目标会持续只要它的观点还活着。
回首忆惘然
TA贡献1847条经验 获得超11个赞
Picasso没有对Target对象的强引用,因此它被垃圾收集并且不调用onBitmapLoaded。
解决方案很简单,juste强烈引用了Target。
public class MyClass { private Target mTarget = new Target() {...}; public void getPointMarkerFromUrl(final String url, final OnBitmapDescriptorRetrievedListener listener) { Picasso.with(context) .load(url) .resize(maxSize, maxSize) .into(mTarget); }}
慕仙森
TA贡献1827条经验 获得超7个赞
如果我有ImageView,我会这么简单:imageView.setTag(target);
我使用下一个解决方案将Bitmaps加载到通知中,所以我只需要位图。
因此,创建Set witch将存储Target对象并在完成加载时将其删除。
final Set<Target> protectedFromGarbageCollectorTargets = new HashSet<>();private void loadBitmap(String url) { Target bitmapTarget = new BitmapTarget(nEvent); protectedFromGarbageCollectorTargets.add(bitmapTarget); Picasso.with(context).load(url).into(bitmapTarget);}class BitmapTarget implements Target { @Override public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom loadedFrom) { //handle bitmap protectedFromGarbageCollectorTargets.remove(this); } } } @Override public void onBitmapFailed(Drawable drawable) { protectedFromGarbageCollectorTargets.remove(this); } @Override public void onPrepareLoad(Drawable drawable) { } }
添加回答
举报
0/150
提交
取消