2015-09-04 22 views
19

Senaryo: - Resim Yükleme ve önbelleğe alma kütüphanesiGlide: Görüntünün önceden önbelleğe alınmış olup olmadığını ve önbelleğe alınmış sürümü nasıl kullanır?

Ben ilk defa kullanıcı Glide kullanarak uygulamasını açar önbelleğe istediğiniz büyük bir GIF resmi var. Bundan sonra kullanıcı uygulamayı açtığında, varsa önbelleğe alınmış sürümü göstermek istiyorum. Bu GIF URL’si belirli bir aradan sonra sona erecektir. Süresi dolduğunda, gelecekteki kullanım için yeni GIF URL'sini ve görüntü/önbelleği alırım.

Ben Glide en github sayfasından Caching and Cache Invalidation geçti: Denedim ne

. Ayrıca, Google Grup iş parçacığı Ensuring That Images Loaded Only Come From Disk Cache, görüntü formu önbelleğini nasıl alacağınızı gösteren de gittim. Ayrıca How to invalidate Glide cache for some specific images sorudan geçtim.

Yukarıdaki bağlantılardan görüntünün önbellekten nasıl yükleneceğini gösteren aşağıdaki kod parçacığını görüyorum. Ancak bu sadece görüntüyü önbellekten almaya çalışır. önbellekte onun mevcut değil ise, ağdan elde etmeye çalışmak ve başarısız değildir:

Glide.with(TheActivity.this) 
     .using(new StreamModelLoader<String>() { 
      @Override 
      public DataFetcher<InputStream> getResourceFetcher(final String model, int i, int i1) { 
       return new DataFetcher<InputStream>() { 
        @Override 
        public InputStream loadData(Priority priority) throws Exception { 
         throw new IOException(); 
        } 

        @Override 
        public void cleanup() { 
        } 

        @Override 
        public String getId() { 
         return model; 
        } 

        @Override 
        public void cancel() { 
        } 
       }; 
      } 
     }) 
     .load("http://sampleurl.com/sample.gif") 
     .diskCacheStrategy(DiskCacheStrategy.SOURCE) 
     .into(theImageView); 

Sorular:

  1. aşağıdaki ulaşmak için daha temiz bir yolu var mı: göster Önceden GIF görüntüsünü varsa, GIF'i indirin, daha sonra kullanmak için önbelleğe alın ve ImageView'da gösterin.

  2. yukarıdaki önbelleğe alma makalede aşağıdaki bahseder: Uygulamada

    , bir önbellek dosyası geçersiz etmenin en iyi yolu tanımlayıcılarınızı değiştirmektir zaman içerik değişiklikleri (url, uri, dosya yolu vb)

    Sunucu, bir öncekinin süresi dolduğunda uygulamaya farklı bir URL gönderir. Bu durumda, eski görüntünün sonunda Çöp Toplanacağına inanıyorum? Resmi önbellekten kaldırmaya zorlamanın bir yolu var mı?

  3. Benzer bir notta, belirli bir anahtarla (büyük dosyanın tekrar indirilmesini engellemek için) Çöp Toplama Görüntüsünün engellenmesinin bir yolu var mı ve sonra URL değiştiğinde eski resmi önbellekten silme talimatı var mı?

cevap

24
  1. Bunu aslında Glide varsayılan davranışı var, mevcut cache eğer gelen GIF göstermek ve başka türlü getirmesi için özel bir ModelLoader gerekmez. Sadece standart bir yük hattını kullanarak sorunsuz çalışır:

    Glide.with(TheActivity.this) 
        .load("http://sampleurl.com/sample.gif") 
        .diskCacheStrategy(DiskCacheStrategy.SOURCE) 
        .into(theImageView); 
    
  2. sizin gibi sesler GIF indirmesini Glide önleyecektir ve zaten önbelleğe ise yalnızca GIF gösterecektir Kodunuz, istemiyoruz

.

  1. Evet, eski görüntü en sonunda kaldırılacak. Varsayılan olarak Glide bir LRU önbellek kullanır, bu nedenle önbellek dolduğunda, en son kullanılan resim kaldırılır. İsterseniz buna yardımcı olmak için önbelleğin boyutunu kolayca özelleştirebilirsiniz.Önbellek boyutunu değiştirmek için Configuration wiki sayfasına bakın.

  2. Maalesef önbellek içeriğini doğrudan etkileme yolu yoktur. Bir öğeyi açıkça kaldıramazsınız veya tutulacak birini zorlayamazsınız. Pratik olarak, uygun bir disk önbellek boyutu ile, genellikle de yapmak için endişelenmenize gerek yoktur. Resminizi yeterince sık gösterirseniz, tahliye edilmeyecektir. Ek öğeleri önbelleğe almayı denerseniz ve önbellekte yer kalmazsa, eski öğeler yer açmak için otomatik olarak tahliye edilir.

+0

Yanıtlamak için zaman ayırdığınız için çok teşekkürler. Aslında bu pek çok şeyi açıklığa kavuşturuyor. İlk noktanız yapmak istediğim bir şey. Varsayılan davranış olup olmadığından emin değildim. Ancak, standart kodun önbelleğe alınan görüntüyü kullanmadığını düşünmeme neden olan şey, bu kod ilk kez çalıştırıldığında, Glide'nin görüntüyü önbelleğe aldığını varsaydım. Şimdi uygulamayı kapatıp interneti kapatıyorum. Şimdi uygulamayı açtığımda, cihaz çevrimdışı olduğunda görüntü gösterilmiyor. Ancak, soruda belirtildiği gibi StreamModelLoader kullandığımda, onu görüntülüyor mu? Yardımlarınız için minnettarım. –

+0

Sanırım haklıydın. Şimdi eminim neden daha önce olmuyordu. Tekrar teşekkürler –

+1

GIF çevrimdışı yüklemek için bu özel ModelLoader ihtiyacınız olan davranışını görürseniz, bu işe yaradı sevindim GitHub (https://github.com/bumptech/glide/issues/ yeni) bu yüzden ona bakabiliriz, kesinlikle gerekli olmamalı. –

1
Glide.with(context) 
.load("http://sampleurl.com/sample.gif") 
.skipMemoryCache(true) 
.into(imageView); 

Zaten biz özellikle hafıza önbellek atlamak için Glide anlatmak için (doğru) .skipMemoryCache denilen fark ettim. Bu, Glide'nin görüntüyü bellek önbelleğine yerleştirmeyeceği anlamına gelir. Anlamak önemlidir, bu sadece hafıza önbelleğini etkiler! Glide, aynı resim URL'sine bir sonraki istek için başka bir ağ isteğinden kaçınmak için disk önbelleğini kullanmaya devam edecektir. Daha fazla bilgi için bu Glide Cache & request optimization.

Mutlu kodlama!

İlgili konular