2010-08-21 10 views
18

Mam obecnie pliki obrazów buforujących aplikacje w podkatalogu cache aplikacji. Obrazy są używane w pliku ListView i przechowywane w postaci HashMap z SoftReferences do do .Najlepsze wskazówki dotyczące buforowania plików w systemie Android

Moje pytanie brzmi: jaki jest najlepszy sposób buforowania tych plików obrazów bez nadmiaru miejsca, z którego korzysta moja aplikacja ORAZ pozostaje responsywny z punktu widzenia użytkownika.

Czego jestem zaniepokojony:

wiem, użytkownik może wyczyścić pamięć podręczną i że odbywa się automatycznie, gdy przestrzeń jest mało pamięci wewnętrznej, ale czuję, że większość użytkowników będzie zobaczyć kilka MB aplikację i ją odinstalować . Ponadto, jeśli przestrzeń jest ciągle niska, moja aplikacja będzie po prostu nadal pobierać obrazy, co sprawi, że będą wolniejsze.

Większość urządzeń ma preinstalowaną kartę SD, ale co należy zrobić, gdy nie jest włożona? Karta SD może być wolniejsza w porównaniu z pamięcią wewnętrzną, co wpływa na wydajność mojej aplikacji.

Czy powinienem podać opcję wyboru położenia pamięci podręcznej?

Czy powinienem próbować zarządzać rozmiarem pamięci podręcznej (czy to w/cache lub/sdcard) czy po prostu o tym zapomnieć?

Dziękuję za poświęcony czas (długi, który znam) i opublikuj wszelkie istotne doświadczenia.

Odpowiedz

15

nie mogę zaoferować kompleksowy zbiór najlepszych praktyk, ale mogę zaoferować, czego nauczyłem się do tej pory:

Zarządzanie pamięci podręcznej jest dobrym pomysłem. Pamięć podręczna mojej aplikacji jest taka, że ​​wiem, że nigdy nie będę potrzebować więcej niż pewną liczbę buforowanych plików, więc za każdym razem, gdy wstawiam nowy plik do pamięci podręcznej, usuwam najstarsze pliki, dopóki nie przekroczę ustawionego limitu. Możesz zrobić coś podobnego na podstawie rozmiaru lub po prostu wieku.

Buforowanie na kartę SD, jeśli jest dostępna, to dobry pomysł, jeśli pamięć podręczna musi zajmować dużo miejsca. Będziesz musiał zarządzać tą przestrzenią tak samo uważnie, ponieważ automatycznie nie usunie miejsca dla ciebie. Jeśli buforujesz pliki graficzne, pamiętaj, aby umieścić je w katalogu zaczynającym się od kropki, na przykład "/yourAppHere/.cache". Dzięki temu obrazy nie pojawią się w galerii, co jest naprawdę denerwujące.

Pozwalając użytkownikowi na wybór lokalizacji pamięci podręcznej, wydaje się to przesadą, ale jeśli twoja publiczność jest bardzo zuchwała, może to być docenione.

Nie zauważyłem dużej kary przy zapisywaniu w pamięci podręcznej, ale nie wiem, w jaki sposób aplikacja wykorzystuje te informacje.

+0

Podoba mi się twoja myśl o zapobieganiu oglądania galerii przez galerię. W jakich warunkach galeria je odbierze? Nie widziałem jeszcze przypadkowych zdjęć i wiem, że w moim telefonie są aplikacje takie jak twidroid, które je buforują. – smith324

+1

@ chris324 Spójrz na http://developer.android.com/guide/topics/data/data-storage.html#filesExternal pod tytułem "Zapisywanie plików, które powinny być udostępnione" – Eric

+0

@Eric dzięki za link, wygląda jak zewnętrzny katalog z pustym plikiem o nazwie '.nomedia' zostanie zignorowany przez MediaScanner. Wygląda również na to, że getExternalCacheDir() jest nowy w wersji 2.2, co przydaje się. – smith324

2

Każdy ma dobre pomysły. Podoba mi się pomysł użycia SoftReference, chociaż nie jestem pewien, jak często te czyści się, ponieważ to bardzo różni się od VM do VM. Możesz łączyć to ze zwykłym HashMap, aby zapobiec wyczyszczeniu całej pamięci podręcznej co kilka minut.

EclipseLink ma kilka różnych implementacji pamięci podręcznej i pretty good documentation on them. Prawdopodobnie możesz skorzystać z kilku pomysłów z wdrożenia (np. LRU, MRU itd.). na przykład,

  • ciężko cache
  • miękki cache
  • połączeniu twardy/miękki cache

Skoro strojenia pamięci podręcznej do sedna, polecam strojenie go do różnych urządzeń w oparciu o twarde specyfikacje. Zazwyczaj jest to zła konstrukcja, ale zakres sprzętu, na którym działa twoje oprogramowanie, wymaga tego od IMHO. np.

  • Wykryj ilość dostępnej pamięci na karcie SD. Większość nowych smartfonów wyposażonych jest w karty SD o wielu GB, które są dość trudne do zapełnienia zwykłym użyciem dla większości użytkowników. Wykorzystaj! Możesz również wykryć ilość dostępnego miejsca na karcie SD podczas uruchamiania i zwiększyć/zmniejszyć rozmiar pamięci podręcznej podczas uruchamiania.
  • Wykryj ilość dostępnej pamięci i skonfiguruj pamięć podręczną, pamiętając o tym. Jeśli użytkownik korzysta ze sprzętowej aplikacji, nie sądzę, że będzie on miał 200 MB pamięci RAM i zapewnia bardzo szybkie działanie, zwłaszcza, że ​​wydali dużo pieniędzy na telefon, który ma 1 -2 GB pamięci RAM.

Powodzenia!

+0

Interesująca lektura. Podoba mi się pojęcie korzystania z połączonej twardej/miękkiej pamięci podręcznej. Dokładne dostrojenie rozmiaru pamięci podręcznej na podstawie dostępnej sterty wydaje się być dla mnie zbyt dużym wysiłkiem, zwłaszcza, że ​​VM da ci taką samą ilość na każdym telefonie. – smith324

+0

Bądź ostrożny przy SoftReferences w systemie Android. System Android usunie je tak szybko, jak to możliwe, nawet jeśli nie jest to zachowanie zaproponowane przez standardy Java. Zamiast Softreferencji użyj pamięci podręcznej LRU, która jest ograniczona do części dostępnej pamięci. http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html – Janusz

0

Czy powinienem podać opcję wyboru położenia pamięci podręcznej?

IMO: Nie, niech uczynić go bardziej najprostsze, jak to możliwe (z wyjątkiem można zawierać wcześniejsze ustawienia użytkownika eksperckiego)

powinienem próbować zarządzać rozmiar mojego cache (czy to w/cache lub/sdcard) lub po prostu o tym zapomnieć?

IMO: Jest to opcja, to podwójny miecz: Twój więcej pracy na tle pomogą użytkownikowi większą wygodę, ale także bardziej błąd podatne

używać 3rd libs: IMO przy użyciu 3rd biblioteki jak Picasso lepiej, automatycznie obsługuje kolejność pamięci podręcznej: Pamięć cache -> Pamięć podręczna dysku -> Sieć

Powiązane problemy