ProgramingTip

Picasso에서 캐시 무효화

bestdevel 2020. 10. 22. 22:16
반응형

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

반응형