我正在使用毕加索显示一个人的肖像,当肖像改变时,我想清除这个用户的缓存(或所有用户的肖像缓存),这是我的代码,它不能工作,有人能帮我吗?
LruCache lruCache = new LruCache(context);
lruCache.clear();
Picasso picasso = new Picasso.Builder(context).memoryCache(lruCache).build();
picasso.load(portraitUrl).resize(50, 50).centerCrop().error(R.drawable.user_portrait).into(portaitView);发布于 2015-02-15 17:10:36
在毕加索的最新版本中,有一种新的无效方法,没有任何解决方法,所以我认为前面提到的自定义PicassoTools类现在已经过时了
Picasso.with(getActivity()).invalidate(file);发布于 2014-06-03 02:39:44
我正面临着同样的问题,没有一个解决方案对我来说是可以接受的……所以我至少用反射做了一个解决方案。我没有使用裁剪,调整大小等等,所以我的clear函数只有在你只使用load(url)来调整大小,裁剪,变换的时候才有效……但我定制了完整的getKey函数,所以这至少对扩展clear函数有很大帮助。或者只是将getKey函数设置为公共,并将clear(uri)函数更改为clear(key)...
我只是从源代码中复制了键函数并采用了它。
只需从我的tools类中获取picasso实例,一切都应该正常工作(例如,您可以添加一个初始化函数来初始化PicassoTools类,例如使用应用程序上下文,而不是像我这样拥有一个上下文提供程序)。
只需使用以下tools类:
public class PicassoTools
{
private static Picasso picasso = null;
private static CustomLruCache lruCache = null;
private static CustomLruCache getCache()
{
if (lruCache == null)
lruCache = new CustomLruCache(MainApp.getAppContext());
return lruCache;
}
public static Picasso getPicasso()
{
if (picasso == null)
picasso = new Picasso.Builder(MainApp.getAppContext()).memoryCache(getCache()).build();
return picasso;
}
public static void clear(Uri uri)
{
getCache().remove(getKey(uri));
}
public static void clearCache()
{
getCache().clear();
// Picasso.with(MainApp.getAppContext()).cache.clear();
}
public static void clearCache(Context c)
{
getCache().clear();
// Picasso.with(c).cache.clear();
}
private static final int KEY_PADDING = 50; // Determined by exact science.
private static String getKey(Uri uri)
{
return getKey(uri, null, 0, 0, false, false, null);
}
private static String getKey(Uri uri, Integer resourceId, int targetWidth, int targetHeight, boolean centerCrop, boolean centerInside, List<Transformation> transformations)
{
StringBuilder builder = new StringBuilder();
if (uri != null)
{
String path = uri.toString();
builder.ensureCapacity(path.length() + KEY_PADDING);
builder.append(path);
}
else
{
builder.ensureCapacity(KEY_PADDING);
builder.append(resourceId);
}
builder.append('\n');
if (targetWidth != 0)
{
builder.append("resize:").append(targetWidth).append('x').append(targetHeight);
builder.append('\n');
}
if (centerCrop)
{
builder.append("centerCrop\n");
}
else if (centerInside)
{
builder.append("centerInside\n");
}
if (transformations != null)
{
// noinspection ForLoopReplaceableByForEach
for (int i = 0, count = transformations.size(); i < count; i++)
{
builder.append(transformations.get(i).key());
builder.append('\n');
}
}
return builder.toString();
}
}和扩展缓存类:
public class CustomLruCache extends LruCache
{
public CustomLruCache(Context context)
{
super(context);
}
public CustomLruCache(int value)
{
super(value);
}
@Override
public Bitmap get(String key)
{
L.d(this, key);
return super.get(key);
}
public void remove(String key)
{
try
{
Bitmap value = map.remove(key);
Field fieldSize = LruCache.class.getDeclaredField("size");
fieldSize.setAccessible(true);
Integer size = (Integer) fieldSize.get(this);
size -= Utils.getBitmapBytes(value);
fieldSize.set(this, size);
Field fieldEvictionCount = LruCache.class.getDeclaredField("evictionCount");
fieldEvictionCount.setAccessible(true);
Integer evictionCount = (Integer) fieldEvictionCount.get(this);
evictionCount++;
fieldEvictionCount.set(this, evictionCount);
}
catch (IllegalArgumentException e)
{
L.e(this, e);
}
catch (IllegalAccessException e)
{
L.e(this, e);
}
catch (NoSuchFieldException e)
{
L.e(this, e);
}
}
}PS:灵感来自Invalidate cache in Picasso
https://stackoverflow.com/questions/22243417
复制相似问题