2015-09-04 9 views
19

Scenariusz:Glide: Jak sprawdzić, czy obraz jest już zapisany w pamięci podręcznej i użyć wersji z pamięci podręcznej?

mam dużą GIF którego chcę buforować raz pierwszy użytkownik otwiera aplikację używając Glide - Loading obrazu i biblioteki buforowania. Potem, gdy użytkownik otworzy aplikację, chcę pokazać wersję z pamięci podręcznej, jeśli jest obecna. Ten adres URL GIF wygaśnie po upływie podanego czasu. Po wygaśnięciu pobierzemy nowy URL GIF i ekran/pamięć podręczną, które będą używane w przyszłości.

Co próbowałem:

przeszedłem Caching and Cache Invalidation na stronie github Glide jest. Poszedłem również do wątku Grupy Google Ensuring That Images Loaded Only Come From Disk Cache, który pokazuje, jak uzyskać pamięć podręczną z postaci obrazu. Przeszedłem również przez pytanie: How to invalidate Glide cache for some specific images.

Z linków powyżej widzę następujący kod sniplet, który pokazuje, jak załadować obraz z pamięci podręcznej. Jednak to tylko próbuje uzyskać obraz z pamięci podręcznej. Jeśli jej nie przedstawi w pamięci podręcznej, nie starają się z siecią, a nie:

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

Pytania:

  1. Czy istnieje przejrzysty sposób, aby osiągnąć następujące: Lista Obraz GIF z pamięci podręcznej, jeśli jest obecny, pobierz GIF, zapisz go w pamięci podręcznej do późniejszego wykorzystania i pokaż go w wersji ImageView.

  2. Artykuł buforowanie wyżej wskazano, co następuje:

    W praktyce, najlepszym sposobem, aby unieważnić plik cache jest zmiana swój identyfikator, gdy zmienia się zawartość (URL, uri, ścieżka pliku etc)

    Serwer wysyła inny adres URL do aplikacji po wygaśnięciu poprzedniej. W tym przypadku, wierzę, że stary obraz w końcu będzie Garbage Collected? Czy istnieje sposób na wymuszenie usunięcia obrazu z pamięci podręcznej?

  3. Podobna uwaga: czy istnieje sposób zapobiegania zbieraniu śmieci obrazu za pomocą określonego klucza (aby zapobiec ponownemu pobieraniu dużego pliku), a następnie poinstruować, aby usunąć stary obraz z pamięci podręcznej po zmianie adresu URL?

Odpowiedz

24
  1. Nie trzeba niestandardowego ModelLoader pokazać GIF z pamięci podręcznej jeżeli są i można pobrać go w inny sposób, to faktycznie jest domyślne zachowanie Glide. Wystarczy za pomocą standardowej linii ładunkowej powinny działać prawidłowo:

    Glide.with(TheActivity.this) 
        .load("http://sampleurl.com/sample.gif") 
        .diskCacheStrategy(DiskCacheStrategy.SOURCE) 
        .into(theImageView); 
    

Twój kod będzie zapobiegać Glide z pobraniem GIF i pokaże tylko GIF, jeśli jest już w pamięci podręcznej, co brzmi jak nie chcesz .

  1. Tak, stary obraz zostanie ostatecznie usunięty. Domyślnie Glide używa pamięci podręcznej LRU, więc gdy pamięć podręczna jest pełna, najmniej używany ostatnio obraz zostanie usunięty. Możesz łatwo dostosować rozmiar pamięci podręcznej, aby pomóc to razem, jeśli chcesz.Zajrzyj na stronę wiki Configuration, aby dowiedzieć się, jak zmienić rozmiar pamięci podręcznej.

  2. Niestety, nie można bezpośrednio wpływać na zawartość pamięci podręcznej. Nie można ani wyraźnie usunąć elementu, ani wymusić jego zachowania. W praktyce z odpowiednim rozmiarem pamięci podręcznej dysku zazwyczaj nie musisz się martwić. Jeśli często wyświetlasz obraz, nie zostanie on wyeksmitowany. Jeśli spróbujesz buforować dodatkowe elementy i zabraknie miejsca w pamięci podręcznej, starsze elementy zostaną wyrzucone automatycznie, aby zwolnić miejsce.

+0

Dziękuję bardzo za poświęcenie czasu na odpowiedź. W rzeczywistości to wyjaśnia wiele rzeczy. Dla twojego pierwszego punktu to coś, co chcę zrobić. Po prostu nie byłem pewien, czy to było domyślne zachowanie. Jednak to, co sprawiło, że sądzę, że standardowy kod nie używa obrazu z pamięci podręcznej, to że po uruchomieniu tego kodu po raz pierwszy zakładam, że Glide buforuje obraz. Teraz zamykam aplikację i wyłączam internet. Teraz po uruchomieniu aplikacji obraz nie jest wyświetlany, gdy urządzenie jest w trybie offline. Jednak kiedy używam 'StreamModelLoader' jak wspomniano w pytaniu, wyświetla to? Doceniam twoją pomoc. –

+0

Myślę, że miałeś rację. Teraz pewnie, dlaczego nie działo się to wcześniej. Jeszcze raz dziękuję –

+1

Cieszę się, że się udało, jeśli widzisz zachowanie, w którym potrzebujesz niestandardowego ModelLoadera, aby załadować GIF w trybie offline, proszę otworzyć problem na GitHub (https://github.com/bumptech/glide/issues/ nowy), abyśmy mogli się temu przyjrzeć, zdecydowanie nie powinno to być konieczne. –

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

Już zauważyliśmy, że nazwaliśmy .skipMemoryCache (prawdziwe), aby wyraźnie powiedzieć Glide pominąć pamięci podręcznej. Oznacza to, że Glide nie umieszcza obrazu w pamięci podręcznej pamięci. Ważne jest, aby zrozumieć, że wpływa to tylko na pamięć podręczną pamięci! Glide nadal będzie wykorzystywać pamięć podręczną dysku, aby uniknąć kolejnego żądania sieci dla następnego żądania pod tym samym adresem URL obrazu. Aby uzyskać więcej informacji, przeczytaj ten Glide Cache & request optimization.

Szczęśliwe kodowanie !!

Powiązane problemy