Android 如何在下次请求相同的图像URL时强制毕加索缓存并使用已调整大小的图像

Android 如何在下次请求相同的图像URL时强制毕加索缓存并使用已调整大小的图像,android,caching,picasso,Android,Caching,Picasso,我使用毕加索在我的应用程序中显示图像。在某些情况下,收到的图像非常巨大,在这些情况下,我想调整图像的大小,从现在起使用调整大小的图像 我使用毕加索的以下方法接收位图图像: articleVH.mTarget = new Target() { @Override public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) { if(bitmap != null) { arti

我使用毕加索在我的应用程序中显示图像。在某些情况下,收到的图像非常巨大,在这些情况下,我想调整图像的大小,从现在起使用调整大小的图像

我使用毕加索的以下方法接收位图图像:

articleVH.mTarget = new Target() {
    @Override
    public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
    if(bitmap != null) {
             articleVH.mCoverImage.setImageBitmap(Utils.getResizedBitmapIfNeeded(bitmap));
        } else {
             mTimelineViewCallback.getArticleImage(articleCoverData);
        }
    }

    @Override
    public void onBitmapFailed(Drawable errorDrawable) {
        mTimelineViewCallback.getArticleImage(articleCoverData);
    }

    @Override
    public void onPrepareLoad(Drawable placeHolderDrawable) {}
};
现在我希望在
Utils.getResizedBitmapIfNeeded(位图)
调整图像大小的情况下,下次请求时使用此调整大小的图像


如何在不使用resize(int,int)选项的情况下实现这一点,我知道该选项正在缓存图像,但我无法使用它。

我考虑的一种方法如下:

articleVH.mTarget = new Target() {
    @Override
    public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
        if(bitmap != null) {
            int[] resizedImageSize = Utils.getResizedImageSize(bitmap);
            if (bitmap.getHeight() == resizedImageSize[0] && bitmap.getWidth() == resizedImageSize[1]) {
                mPicasso.load(articleCoverData.mImageUrl).into(articleVH.mCoverImage);
            } else {
                mPicasso.load(articleCoverData.mImageUrl).resize(resizedImageSize[1], resizedImageSize[0]).into(articleVH.mCoverImage);
            }
        } else {
            mTimelineViewCallback.getArticleImage(articleCoverData);
        }
    }

    @Override
    public void onBitmapFailed(Drawable errorDrawable) {
        mTimelineViewCallback.getArticleImage(articleCoverData);
    }

    @Override
    public void onPrepareLoad(Drawable placeHolderDrawable) {}
}
其中
getResizedImageSize
为:

public static int[] getResizedImageSize(@NonNull Bitmap originalBitmap) {
    int bitmapHeight = originalBitmap.getHeight();
    int bitmapWidth = originalBitmap.getWidth();

    int[] originalSize = {bitmapHeight, bitmapWidth};

    if (!(bitmapHeight > Constants.IMAGE_EDGE_SIZE_LIMIT && bitmapWidth > Constants.IMAGE_EDGE_SIZE_LIMIT)){
        return originalSize;
    }

    if (BuildConfig.DEBUG) {
        Log.e(TAG, "Original Bitmap: Height: " + bitmapHeight + " Width: " + bitmapWidth);
    }

    float ratio = bitmapHeight / Constants.IMAGE_EDGE_SIZE_LIMIT;
    bitmapHeight = Constants.IMAGE_EDGE_SIZE_LIMIT;
    bitmapWidth = (int) (bitmapWidth * (1 / ratio));

    int[] newSize = {bitmapHeight, bitmapWidth};
    return newSize;
}
请记住,这意味着图像将被加载两次。一次,以便获得图像的大小;第二次,用于调整大小并将此图像存储到已调整大小的缓存中。

您可以尝试以下方法:

Picasso
.with(context)
.load(your_image)
.resize(4000, 2000)
.onlyScaleDown() // the image will only be resized if it's bigger than 4000x2000 pixels.
.into(your_image_view);
为什么不能使用resize()?