Picasso将图像加载到目标中。

7

我正在使用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,但除此之外什么也没有。我的图标始终为null。我知道这一点是从其他调用getIcon()的类中知道的。我在这里缺少什么?感谢任何帮助。
2个回答

16

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

这就是我需要做的。非常感谢! - AndroidDev

2

1
谢谢。我看过那篇文章,但没有意识到关键是将“Target”引用提升为实例变量。现在我知道了。再次感谢! - AndroidDev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接