gpt4 book ai didi

picasso - 首次加载时未调用目标对象的 onBitmapLoaded

转载 作者:行者123 更新时间:2023-12-03 04:32:45 33 4
gpt4 key购买 nike

在我的函数中:

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() 方法,但不能同时使用 into(mytarget)

您能解释一下如何将 fetch() 与自定义目标一起使用吗?谢谢。

文档:http://square.github.io/picasso/javadoc/com/squareup/picasso/RequestCreator.html#fetch--

最佳答案

正如其他受访者(@lukas 和 @mradzinski)所指出的,Picasso 只保留对 Target 对象的弱引用。虽然您可以在某个类中存储强引用 Target,但如果 Target 以任何方式引用 View,这仍然可能会出现问题,因为您实际上还可以保留对该 View 的强引用(这是 Picasso 明确帮助您避免的事情之一)。

如果您遇到这种情况,我建议将 Target 标记到 View:

final ImageView imageView = ... // The view Picasso is loading an image into
final Target target = new Target{...};
imageView.setTag(target);

这种方法的好处是让 picasso 为您处理一切。它将管理每个 View 的 WeakReference 对象 - 一旦不再需要某个 View ,任何处理图像的 Target 也将被释放,所以你不需要由于长期存在的目标而导致内存泄漏,但只要其 View 还活着,您的目标就会持续存在。

关于picasso - 首次加载时未调用目标对象的 onBitmapLoaded,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24180805/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com