Picasso에서 캐시 무효화
예를 들어 Picasso를 사용하여 디스크에서 이미지를로드 Picasso.with(ctx).load(new File("/path/to/image")).into(imageView)
하지만 해당 파일에 새 이미지를 저장하고 ImageView
새로 고칠 때마다 Picasso에는 여전히 비트 맵이 캐시되어 있습니다.
Picasso에서 캐시를 무효화 할 수 있습니까?
최신 버전의 Picasso는 해결 방법이없는 새로운 무효화 방법이 있습니다.
Picasso.with(getActivity()).invalidate(file);
실제로 자신의 답변에 따라 라이브러리를 포크하지 않고 쉽게 수행 할 수있는 방법이 있습니다. 이 클래스를 com.squareup.picasso 패키지에 추가하십시오.
package com.squareup.picasso;
public class PicassoTools {
public static void clearCache (Picasso p) {
p.cache.clear();
}
}
캐시에는 패키지 가시성이 있으므로 util 클래스는 캐시를 지울 수 있습니다. 당신은 그것을 호출해야합니다.
PicassoTools.clearCache(Picasso.with(context));
다음 코드 조각과 같이 emoryPolicy.NO_CACHE 및 NetworkPolicy.NO_CACHE 플래그로 메모리 정책을 표시하여 메모리 캐시 및 디스크 캐시 검사를 중단합니다.
mPicasso.with(mContext)
.load(url)
.memoryPolicy(MemoryPolicy.NO_CACHE )
.networkPolicy(NetworkPolicy.NO_CACHE)
.resize(512, 512)
.error(R.drawable.login)
.noFade()
.into(imageView);
사용하십시오 :
Picasso.with(ctx).load(new File("/path/to/image")).skipMemoryCache().into(imageView)
또 다른 옵션은 예를 들어 앱 시작시 디렉토리 자체를 삭제하는 것입니다.
deleteDirectoryTree(context.getCacheDir());
어디 :
/**
* Deletes a directory tree recursively.
*/
public static void deleteDirectoryTree(File fileOrDirectory) {
if (fileOrDirectory.isDirectory()) {
for (File child : fileOrDirectory.listFiles()) {
deleteDirectoryTree(child);
}
}
fileOrDirectory.delete();
}
이렇게하면 전체 캐시 디렉터리가 삭제됩니다. 앱의 첫 사용을 시뮬레이션하려는 경우 괜찮습니다. Picasso 캐시 만 삭제하려는 경로에 "picasso-cache"를 추가하십시오.
번에 모든 한 캐시를 삭제하려면 user-지정 Picasso.LruCache
을 만든 다음 해당 clear
메서드 를 사용하면 됩니다.
다음은 샘플입니다.
Picasso.Builder builder = new Picasso.Builder(this);
LruCache picassoCache = new LruCache(this);
builder.memoryCache(picassoCache);
Picasso.setSingletonInstance(builder.build());
캐시를 지우려면 :
picassoCache.clear();
Picasso의 검색 이미지 순서는 메모리 캐시-> 디스크 캐시-> 네트워크입니다.
따라서 Picasso에서 캐시를 무효화해야하는 시나리오는 거의 없습니다.
1. 메모리 캐시 무효화 :
- Usercase : 이미지가 이미 디스크 캐시 또는 원격 호스트에서 업데이트 된 경우
해결 방법 : Url, File, Uri가있는 경우 캐시 지우기
mPicasso.with(appContext).invalidate(File); mPicasso.with(appContext).invalidate(Url); mPicasso.with(appContext).invalidate(Uri);
.
2. 메모리 캐시 및 디스크 캐시 온라인 무효화
※ 참고 : 온라인 이란 ImageView로 직접 업데이트하는 것을 의미 합니다.
사용자 사례 : 원격 호스트에서 업데이트 된 이미지
솔루션 : 메모리 캐시 및 디스크 캐시에서 이미지를 중단 한 다음 원격 호스트에서 이미지 요청
mPicasso.with(appContext) .load(url) .memoryPolicy(MemoryPolicy.NO_CACHE ) .networkPolicy(NetworkPolicy.NO_CACHE) .into(imageView);
-> 메모리 캐시 및 디스크 캐시 중단
.
3. 캐시 및 디스크 메모리 캐시를 off-line으로 무효화
※ 참고 : 오프라인 은 ImageView로 업데이트하지 않고 나중에 사용하기 위해 배경 가져 오기만하는 것을 의미 합니다.
- 사용자 사례 : 원격 호스트의 이미지가 업데이트 된 것을 나중에 사용하는 경우에만 캐시를 업데이트합니다 (이미지보기로 업데이트하지 않음).
솔루션 : 가져 오기만
mPicasso.with(appContext) .load(url) .memoryPolicy(MemoryPolicy.NO_CACHE) .networkPolicy(NetworkPolicy.NO_CACHE) .fetch();
※ 참고 : fetch ()를 사용하는 것은 좋지만 네트워크 리소스도 소모적으로 신중하게 고려하여 아래 시나리오 4를 확인하여 더 나은 해결책을 찾으십시오.
4. 디스크 캐시가있는 경우 메모리 캐시 및 디스크 캐시를 off-line으로 무효화 합니다.
- 사용자 사례 : 디스크 캐시에 이미있는 경우에만 캐시를 무효화합니다.
해결 방법 : 가져 오기 전에 NetworkPolicy.OFFLINE 캐시 변수를 사용하여 디스크를 확인해야합니다.
mPicasso.with(appContext) .load(url) .memoryPolicy(MemoryPolicy.NO_CACHE) .networkPolicy(NetworkPolicy.OFFLINE) .fetch(new Callback() { @Override public void onSuccess() { //Success: mean disk cache exist -> should do actual fetch picasso.load(url).fetch(); } @Override public void onError() { //Failed: mean disk cache not exist } });
피카소는 놀라운 라이브러리입니다. 앞으로 squareup이 캐시를 관리하기 위해 더 편리한 API를 추가하기를 바랍니다.
자신의 캐시를 설정하여 피카소의 이미지 캐시를 지울 수 있습니다. 이 코드는 Picasso 2.5.0에서 테스트되었습니다.
private Picasso picasso;
private LruCache picassoLruCache;
picassoLruCache = new LruCache(context);
// Set cache
picasso = new Picasso.Builder(context) //
.memoryCache(picassoLruCache) //
.build();
// Clear cache
picassoLruCache.clear();
꽤 반복되지는 않지만 접근 방식은 캐시 및 피카소 문제를 해결했습니다. 특정 URL에 대한 캐시를 무효화하려는 경우에만 사용하십시오.이 접근 방식은 느리고 올바른 방법은 방법은 저에게 아마도 올바른 방법입니다.
String url = "http://www.blablabla.com/Raiders.jpg";
Picasso.with(this).invalidate(url);
Picasso.with(this)
.load(url)
.networkPolicy(
NetworkUtils.isConnected(this) ?
NetworkPolicy.NO_CACHE : NetworkPolicy.OFFLINE)
.resize(200, 200)
.centerCrop()
.placeholder(R.mipmap.ic_avatar)
.error(R.mipmap.ic_avatar)
.into(imageView);
여기에 허용되는 답변에서 매우 중요한 부분이 누락되었습니다. 여기에서 트릭을 찾았습니다. http://blogs.candoerz.com/question/124660/android-image-cache-is-not-clearing-in-picasso.aspx
다음 줄을 호출하면 원본 이미지를 표시 할 때 크기 조정, 가운데 자르기 등과 같은 사용자 지정 옵션을 사용할 때 사진 캐시가 지워지지 않습니다.
Picasso.with(getContext()).invalidate(file);
해결책:
이미지를 표시 할 때 stableKey()
방법을 사용하십시오 .
Picasso.with(getContext()).load(new File(fileUri))
.skipMemoryCache()
.placeholder(R.drawable.placeholder)
.stableKey(fileUri)
.into(imageview);
그런 다음 나중에 다음을 호출하여이 파일의 캐시를 지울 수 있습니다.
Picasso.with(getContext()).invalidate(fileUri);
이것이 도움이되기를 바랍니다.
메모리 캐시를 건너 뛸 수 있습니다. skipMemoryCache()
다음을 참조하십시오
Picasso.with(this)
.load(IMAGE_URL)
.skipMemoryCache()
.placeholder(R.drawable.placeholder)
.error(R.drawable.no_image)
.into(mImageViewPicasso);
Gradle compile "com.squareup.picasso:picasso:2.4.0"
또 다른 옵션은 새 이미지를 원본과 다른 파일에 저장하는 것입니다. Picasso 비트 맵 캐시는 파일 경로에서 벗어나기 때문에 다른 파일에서 새 이미지를로드하면 캐시 누락이 발생합니다. 또한 전체 캐시를 지울 필요가 없다는 부수적 인 이점도 있습니다.
shutdown()
대신 소스 코드에 따라 사용하십시오 . 종료는 추가 요청 수락을 중지하고 모든 캐시를 지 웁니다.
/** Stops this instance from accepting further requests. */
public void shutdown() {
if (this == singleton) {
throw new UnsupportedOperationException("Default singleton instance cannot be shutdown.");
}
if (shutdown) {
return;
}
cache.clear();
cleanupThread.shutdown();
stats.shutdown();
dispatcher.shutdown();
for (DeferredRequestCreator deferredRequestCreator : targetToDeferredRequestCreator.values()) {
deferredRequestCreator.cancel();
}
targetToDeferredRequestCreator.clear();
shutdown = true;
}
또한 싱글 톤 인스턴스를 종료 할 수 없습니다. 따라서에 대한 인스턴스 변수가 필요합니다 Picasso
. shutdown()
다시 사용하기 위해 매번 피카소 인스턴스 를 다시 초기화하는 것을 잊지 마십시오
File f = new File(path, name);
Picasso.with(this).invalidate(Uri.fromFile(f));
참고 URL : https://stackoverflow.com/questions/22016382/invalidate-cache-in-picasso
'ProgramingTip' 카테고리의 다른 글
단항 더하기 연산자는 무엇을 소유하고 있습니까? (0) | 2020.10.22 |
---|---|
href 요소에서 클릭 이벤트를 트리거하는 방법 (0) | 2020.10.22 |
Objective-C의 제거에서 공백 제거 (0) | 2020.10.22 |
git commit get fatal error "fatal : CRLF will be replace by LF in" (0) | 2020.10.22 |
오류 : ORA-65096 : 오라클의 공용 사용자 또는 역할 이름이 잘못되었습니다. (0) | 2020.10.22 |