Очистить память кэша Пикассо
Я пытаюсь очистить кэш-память Picasso через Android-кодирование.
Кто-нибудь может помочь мне в этом вопросе.?
Я пробовал использовать следующий код, но это было бесполезно в моем случае:
Picasso.with(getActivity()).load(data.get(pos).getFeed_thumb_image()).skipMemoryCache().into(image);
Ответы
Ответ 1
если вы пытаетесь загрузить изображение через Json (из db), попробуйте очистить сетевой кеш для лучшего результата.
Picasso.with(context).load(uri).networkPolicy(NetworkPolicy.NO_CACHE)
.memoryPolicy(MemoryPolicy.NO_CACHE)
.placeholder(R.drawable.bv_logo_default).stableKey(id)
.into(viewImage_imageView);
Ответ 2
Используйте это вместо:
Picasso.with(getContext()).load(data.get(pos).getFeed_thumb_image()).memoryPolicy(MemoryPolicy.NO_CACHE).into(image);
Ответ 3
Удалите кеш пикассо, как это.
public class Clear {
public static void clearCache (Picasso p) {
p.cache.clear();
}
}
Этот класс util может очистить кэш для вас. Вам просто нужно называть это:
Clear.clearCache(Picasso.with(context));
ИЗМЕНИТЬ:
Класс Clear должен быть в пакете:
package com.squareup.picasso;
Поскольку кэш недоступен извне этого пакета.
Как в этом ответе: fooobar.com/questions/89072/...
Ответ 4
Когда активность уничтожается, к сожалению, битмап не был переработан, если мы используем Picasso. Я пытаюсь программно переработать растровое изображение, загруженное в изображение. Существует способ ссылки на загруженное растровое изображение с помощью Target
.
Target mBackgroundTarget = new Target() {
Bitmap mBitmap;
@Override
public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
if (bitmap == null || bitmap.isRecycled())
return;
mBitmap = bitmap;
mBgImage.setImageBitmap(bitmap);
mHandler.post(new Runnable() {
@Override
public void run() {
// Do some animation
}
});
}
@Override
public void onBitmapFailed(Drawable errorDrawable) {
recycle();
}
@Override
public void onPrepareLoad(Drawable placeHolderDrawable) {
}
/**
* Recycle bitmap to free memory
*/
private void recycle() {
if (mBitmap != null && !mBitmap.isRecycled()) {
mBitmap.recycle();
mBitmap = null;
System.gc();
}
}
};
И когда Activity destroy, я вызываю onBitmapFailed(null)
для загрузки загруженного растрового изображения.
@Override
protected void onDestroy() {
super.onDestroy();
try {
if (mBackgroundTarget != null) {
mBackgroundTarget.onBitmapFailed(null);
Picasso.with(context).cancelRequest(mBackgroundTarget);
}
} catch (Exception e) {
e.printStackTrace();
}
}
Но помните, НЕ ОБРАЩАЙТЕ ИЗОБРАЖЕНИЕ В ПАМЯТИ в этом случае. Это приведет к использованию исключения переработанной битовой карты.
Picasso.with(context)
.load(imageUrl)
.resize(width, height)
.memoryPolicy(MemoryPolicy.NO_CACHE)
.into(mBackgroundTarget);
Надеюсь на эту помощь.
Ответ 5
Вместо того, чтобы очистить полный кеш, если хотите обновить изображение с данным Uri. попробуйте этот Picasso.with(context).invalidate(uri);
, он внутренне удаляет ключ из кэша, поддерживаемого Picasso.
Выдержка из Picasso.java
/**
* Invalidate all memory cached images for the specified {@code uri}.
*
* @see #invalidate(String)
* @see #invalidate(File)
*/
public void invalidate(Uri uri) {
if (uri == null) {
throw new IllegalArgumentException("uri == null");
}
cache.clearKeyUri(uri.toString());
}
Ответ 6
Если вы сохраняете ссылку на custom Downloader
, вы можете очистить кеш.
public class PicassoUtil {
private static Picasso sInstance;
private static OkHttp22Downloader sDownloader;
public static Picasso getPicasso(Context context){
if(sInstance == null) {
sDownloader = new OkHttp22Downloader(context)
Picasso.Builder builder = new Picasso.Builder(context);
builder.downloader(sDownloader);
sInstance = builder.build(sDownloader);
}
return sInstance;
}
public static void clearCache(){
if(sDownloader != null){
sDownloader.clearCache();
}
}
}
Важно иметь доступ к вашему http-клиенту и его Cache
. В моей реализации есть доступ к кешу, поэтому очистка кеша с помощью метода clearCache()
.
Ответ 7
У меня была та же проблема.
Это сработало для меня.
Я использовал Picasso в RecycleView внутри диалогового окна. Когда я закрыл диалог, picasso не очищает кеш. Но , пока вы используете диалог, он очищает кеш изображения. Однако есть некоторый кеш, который не очищается. Возможно, кеш, который не был очищен, является последним, что вы видели в диалоговом окне перед dialog.dismiss().
используйте это
memoryPolicy (MemoryPolicy.NO_CACHE, MemoryPolicy.NO_STORE)
Picasso.with(activity).load(file).resize(100,100).centerCrop().memoryPolicy(MemoryPolicy.NO_CACHE,MemoryPolicy.NO_STORE).into(contactImage, new com.squareup.picasso.Callback() {
@Override
public void onSuccess() {
}
@Override
public void onError() {
}
});
Ответ 8
Picasso.with(this.getContext()).load(gamePlayer.getPlayerProfileUrl()).skipMemoryCache().into(iv);
Это также работает