毕加索将图像加载到目标中

时间:2016-07-27 15:36:14

标签: android picasso

我正在使用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()

我在这里缺少什么?谢谢你的帮助。

2 个答案:

答案 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