我正在使用Picasso下载各种图片。通常,我只是在ImageView
中显示这些内容,但在这种情况下,我希望对它们进行强有力的引用,以便我可以在不同的地方使用它们,而无需返回缓存或重新下载它们。以下是我尝试这样做的方法(请注意,本课程还有更多内容 - 我只是将其缩小到与此问题相关的部分):
public class MapLayer {
private Context mContext;
private String mType;
private Drawable mIcon = null;
public MapLayer (Context context, String type) {
mContext = context;
mType = type;
downloadIcon();
}
public Drawable getIcon() {return mIcon;}
private void downloadIcon() {
String url = mContext.getString(R.string.maps_icon_url).replace("${type}", mType));
Target target = new Target() {
@Override
public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
Log.d(TAG, "on bitmap loaded");
mIcon = new BitmapDrawable(mContext.getResources(), bitmap);
}
@Override
public void onBitmapFailed(Drawable errorDrawable) {
Log.d(TAG, "on bitmap failed");
}
@Override
public void onPrepareLoad(Drawable placeHolderDrawable) {
Log.d(TAG, "on prepare load");
mIcon = placeHolderDrawable;
}
};
ImageDownloader.getSharedInstance().load(url).into(target);
}
}
在每种情况下,我都会得到输出:
on prepare load
但没有别的。我的图标始终为空。我从其他课程中了解到这一点,我称之为getIcon()
。
我在这里缺少什么?谢谢你的帮助。
答案 0 :(得分:8)
Picasso持有Target
实例的弱引用,所以你的Target
似乎是垃圾收集。
见:https://github.com/square/picasso/issues/352
最好将Target
作为实例字段。
public class MapLayer {
...
private Target target;
private void downloadIcon() {
...
target = new Target() {
...
};
ImageDownloader.getSharedInstance().load(url).into(target);
}
}
答案 1 :(得分:2)
因为毕加索只保留对Target
对象的弱引用。
如果您想拥有强大的参考资料,我建议您将Target
标记为View
。
Here is a solution for your problem