Invalidare la cache Picasso

Caricare un’immagine dal disco utilizzando Picasso, ad esempio, Picasso.with(ctx).load(new File("/path/to/image")).into(imageView), ma ogni volta che si salva una nuova immagine nel file e aggiornare il mio ImageView, Picasso ha ancora la bitmap nella cache.

È possibile invalidare la cache di Picasso?

  • dopo Picasso.with(getActivity()).invalidate(file); come posso di nuovo la cache?
InformationsquelleAutor Maarten | 2014-02-25

 

14 Replies
  1. 84

    Nelle recenti versioni di Picasso, c’è un nuovo metodo per invalidare, senza soluzioni alternative, quindi penso che il costume PicassoTools classe accennato in precedenza, è ormai obsoleto, in questo caso

    Picasso.with(getActivity()).invalidate(file);
    • Beh, che fa decadere un singolo file. Non c’è ancora nessun metodo di invalidare la cache. Comunque, ho risposto a quasi un anno fa, quindi non sono sorpreso che l’hanno aggiunto da allora.
    • Sì, doe invalidare un unico file, come autore ha voluto, non c’è bisogno di cancellare tutta la cache, non è efficace. Hai provato ad implementare in Picasso a voi stessi di un anno fa?
    • Assicurati di utilizzare la versione più recente di Picasso o di un IllegalStateException potrebbe essere gettato. github.com/square/picasso/commit/…
    • invalidare non funziona, l’immagine rimane nella cache del disco
    • È necessario caricare l’immagine con Picasso.with(imageView.getContext()).load(imageUrl).networkPolicy(NetworkPolicy.NO_CACHE).into(imageView); come invalidate() non cancella la cache di rete
    • per cancellare la cache.
    • può essere cache dopo avere nuovamente immagine da url?
    • il campo “cache” non è pubblico più
    • la cache di campo ha sempre avuto pacchetto di visibilità, da qui la necessità di mettere gli Strumenti di classe nel pacchetto corretto.
    • ho visto la tua risposta ora, in realtà, la classe personalizzata. Può essere utilizzato per eliminare un file specifico, invece di tutta la cache?
    • Grazie alla sua risposta di lavoro

  2. 78

    In realtà, sulla base della sua risposta, c’è un modo più semplice per farlo senza trovarvi la biblioteca. Aggiungere questa classe com.squareup.picasso pacchetto.

    package com.squareup.picasso;
    
    public class PicassoTools {
    
        public static void clearCache (Picasso p) {
            p.cache.clear();
        }
    }

    Perché cache del pacchetto di visibilità, questo util classe è in grado di cancellare la cache per voi. Basta chiamare:

    PicassoTools.clearCache(Picasso.with(context));
    • Come fare per accedere a questa classe dal file jar?
    • Non è necessario accedere al vaso. è necessario creare questo file e metterlo nella giusta package (com.squareup.picasso)
    • Oh, vedo. Ha perfettamente senso. Grazie.
    • C’è un modo per fare questo se si utilizza Gradle con Android Studio invece di add-on file jar?
    • abbiamo bisogno di creare questo file all’interno di picasso vaso ?
    • No, non c’è bisogno di toccare il Picasso vaso, è solo bisogno di creare il file nel pacchetto giusto.
    • È un peccato, che Picasso.with(getApplication()).cache.clear();non funziona. Sarebbe molto più pulito.
    • Il campo di Picasso.la cache non è visibile!!
    • Che è il motivo per cui devi mettere che la classe in un pacchetto specificato
    • sembra non funzionare, ho provato a chiamare questa funzione e quindi aperto il mio frammento con le immagini, e ha mostrato le immagini in imageviews istantaneamente (dalla cache)… per la prima volta a carico, di solito, richiede un certo tempo, ma è ancora istantaneamente e utilizzo di memoria da parte di app non diminuire dopo la chiamata di questa funzione, quindi NON funziona
    • stackoverflow.com/a/29173703/7767664 ma questo funziona

  3. 64

    Interruzione di memoria cache e la cache del disco di controllo da indicare memoria politica di bandiera: emoryPolicy.NO_CACHE e NetworkPolicy.NO_CACHE come il seguente frammento di codice:

       mPicasso.with(mContext)
                .load(url)
                .memoryPolicy(MemoryPolicy.NO_CACHE )
                .networkPolicy(NetworkPolicy.NO_CACHE)
                .resize(512, 512)
                .error(R.drawable.login)
                .noFade()
                .into(imageView);
    • questo ha funzionato per me
    • Grazie! L’aggiunta di .networkPolicy(NetworkPolicy.NO_CACHE) funzionato per me.
    • Da questa risposta di immagini mai cache!). quindi perché usarlo?
    • e ‘ utile se si sono di solito lavoro con lo stesso url e di diverso valore di immagine (Esempio: amazonws.com/yourProject/user_profile_images/user1/profile.jpg. L’url non cambia mai, ma il suo valore non.
    • ottimo in caso di url statici, grazie
  4. 14

    Tenta di utilizzare:

    Picasso.with(ctx).load(new File("/path/to/image")).skipMemoryCache().into(imageView)
    • Questo funziona, però vorrei l’immagine di store, l’immagine di cache, basta non leggerlo, se sappiamo che l’immagine non è aggiornato! Ho scoperto che non è possibile farlo in Picasso come-è, quindi mi segno la tua risposta corretta.
    • Volevo aggiornare in qualche modo un’immagine che è stata precedentemente caricata. skipMemoryCache() ha fatto il trucco! Grazie!
    • Questo non è lavoro per me.. è ancora il salvataggio in cache.
    • Questo è deprecato ora
  5. 11

    Un’altra opzione è quella di eliminare la directory della cache stessa, per esempio all’avvio di app:

    deleteDirectoryTree(context.getCacheDir());

    dove:

    /**
     * Deletes a directory tree recursively.
     */
    public static void deleteDirectoryTree(File fileOrDirectory) {
        if (fileOrDirectory.isDirectory()) {
            for (File child : fileOrDirectory.listFiles()) {
                deleteDirectoryTree(child);
            }
        }
    
        fileOrDirectory.delete();
    }

    Che cancella tutta la cartella della cache, che è un bene, se si desidera simulare il primo uso dell’app. Se solo si desidera eliminare il Picasso cache, aggiungere “picasso-cache” per il percorso.

    • Grazie!! Solo questo ha funzionato per me!
    • Kesteloot potrebbe aiutarmi con questa domanda? stackoverflow.com/questions/33657619/… . Ho già usato il metodo con grande successo, ma sto avendo problemi di ora. Grazie in anticipo
    • Altre risposte non solo sbarazzarsi di Memoria Cache, ma non di Cache del Disco – questo si prende cura di un disco troppo! 🙂
  6. 11

    Che cosa si può fare se si desidera cancellare tutte le cache in una volta, è quello di creare un custom Picasso.LruCache, e quindi utilizzare il clear metodo su di esso.

    Qui è un esempio:

    Picasso.Builder builder = new Picasso.Builder(this);
    LruCache picassoCache = new LruCache(this);
    builder.memoryCache(picassoCache);
    Picasso.setSingletonInstance(builder.build());

    Per cancellare la cache:

    picassoCache.clear();
  7. 9

    L’ordine di ricerca immagini di Picasso è:
    Memoria cache -> cache del Disco -> Rete

    Quindi ci sono pochi scenario abbiamo bisogno di invalidare la cache di Picasso:

    1.Invalidare la cache di memoria:

    • Usercase: Quando l’immagine è già di aggiornamento nella cache del disco o di un host remoto
    • Soluzione: Cancellare la cache del Url, il File di Uri, se esiste

      mPicasso.with(appContext).invalidate(File);
      mPicasso.with(appContext).invalidate(Url);
      mPicasso.with(appContext).invalidate(Uri);

    .

    2.Invalidare la memoria cache e la cache del disco Online

    ※nota: Online significa aggiornare direttamente a ImageView

    • Caso utente: Immagine aggiornata su un host remoto

    • Soluzione: per annullare l’immagine nella memoria cache e la cache del disco quindi richiedere immagine su un host remoto

      mPicasso.with(appContext)
          .load(url)
          .memoryPolicy(MemoryPolicy.NO_CACHE )
          .networkPolicy(NetworkPolicy.NO_CACHE)
          .into(imageView);

      -> Interruzione di memoria cache e la cache del disco

    .

    3.Invalidare la memoria cache e la cache del disco Offline

    ※ nota: Offline media update non aggiorna per ImageView, a sfondo recupero per l’utilizzo di più tardi

    • Caso utente: sai immagine su un host remoto aggiornato, ma solo voglia di aggiornare la cache solo per uso in seguito (non aggiornamento in vista immagine)
    • Soluzione: fetch solo

       mPicasso.with(appContext)
          .load(url)
          .memoryPolicy(MemoryPolicy.NO_CACHE)
          .networkPolicy(NetworkPolicy.NO_CACHE)
          .fetch();

    ※Nota: fetch() è buono, ma è anche consumare risorse di rete, quindi, si prega di considerare attentamente, controllare scenario 4 in basso per una migliore soluzione

    4.Invalidare la memoria cache e la cache del disco Offline se la cache del disco è esiste

    • Caso utente: Solo invalidare la cache se esiste già nella cache del disco
    • Soluzione: Deve controllare il disco utilizzando il parametro: NetworkPolicy.Cache non in linea prima di recuperare

       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
          }
      });

    Picasso è un incredibile libs, spero squareup aggiungere più convenienza API per la gestione della cache nel prossimo futuro.

  8. 8

    È possibile cancellare la cache di picasso, impostando il proprio sistema di cache e chiaro che.
    Questo codice è stato testato su 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();
  9. 6

    Non loop abbastanza, ma questo approccio risolto il mio problema con la cache e Picasso. Solo utilizzare questa funzione quando si desidera invalidare la cache per un URL specifico, questo approccio è lento e probabilmente non è il modo corretto di fare, ma funziona per me.

        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);
  10. 2

    Una parte molto importante manca accettato di rispondere qui. Ho trovato il trucco da qui: http://blogs.candoerz.com/question/124660/android-image-cache-is-not-clearing-in-picasso.aspx

    Solo chiamando il seguente linea, non cancellare la cache di una foto quando si utilizza personalizzati, come le opzioni di ridimensionamento, ritaglio centrale ecc quando si visualizza l’immagine originale.

    Picasso.with(getContext()).invalidate(file);

    La soluzione:

    Quando si visualizza l’immagine, utilizzare stableKey() metodo.

    Picasso.with(getContext()).load(new File(fileUri))
                             .skipMemoryCache()
                             .placeholder(R.drawable.placeholder)
                             .stableKey(fileUri)
                             .into(imageview);

    Quindi, è possibile cancellare la cache di questo file in un secondo momento chiamando questo:

    Picasso.with(getContext()).invalidate(fileUri);

    Spero che questo vi aiuterà.

  11. 1

    Si può saltare memoria cache da skipMemoryCache()

    vedere il seguente

            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"

  12. 0

    Un’altra opzione è quella di salvare l’immagine in un file diverso da quello originale. Dal momento che il Picasso di cache bitmap viene digitato fuori del percorso del file, caricare la nuova immagine da un file diverso, si tradurrà in un cache miss. Questo ha anche il beneficio di non dover cancellare tutta la cache.

  13. 0

    utilizzare shutdown() invece
    Come per il codice sorgente; arresto smetterà di accettare ulteriore richiesta così come cancellare la cache

     /** 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;
      }

    Inoltre è possibile non arresto istanza del singleton.
    Quindi è necessario avere variabile di istanza per Picasso. Non dimenticate di reinizializzare picasso esempio, ogni volta che si shutdown() per il riutilizzo

Lascia un commento