Używam a, ListView
aby wyświetlić niektóre obrazy i podpisy związane z tymi obrazami. Dostaję obrazy z Internetu. Czy istnieje sposób na leniwe ładowanie obrazów, więc podczas wyświetlania tekstu interfejs użytkownika nie jest blokowany, a obrazy są wyświetlane podczas pobierania?
Całkowita liczba zdjęć nie jest stała.
setUrl
.Odpowiedzi:
Oto, co stworzyłem, aby przechowywać obrazy, które obecnie wyświetla moja aplikacja. Należy pamiętać, że używany tutaj obiekt „Log” to moje niestandardowe opakowanie wokół ostatniej klasy Log w systemie Android.
źródło
LRU Cache
developer.android.com/training/displaying-bitmaps/…Zrobiłem proste demo leniwej listy (znajdującej się na GitHub) z obrazkami.
Może to komuś pomóc. Pobiera obrazy w tle wątku. Obrazy są buforowane na karcie SD i w pamięci. Implementacja pamięci podręcznej jest bardzo prosta i wystarcza do pokazu. Dekoduję obrazy za pomocą inSampleSize, aby zmniejszyć zużycie pamięci. Staram się również poprawnie obsługiwać widoki przetworzone.
źródło
Polecam instrument open source Universal Image Loader . Pierwotnie opiera się na projekcie LazyList Fedora Własowa i od tego czasu znacznie się poprawił.
źródło
Wielowątkowość dla wydajności , samouczek Gillesa Debunne.
Pochodzi z bloga programistów Androida. Sugerowany kod wykorzystuje:
AsyncTasks
.FIFO cache
.garbage collect
przechowywania pamięć podręczna.Drawable
podczas pobierania.źródło
Aktualizacja: Pamiętaj, że ta odpowiedź jest teraz dość nieskuteczna. Garbage Collector działa agresywnie na SoftReference i WeakReference, więc ten kod NIE jest odpowiedni dla nowych aplikacji. (Zamiast tego wypróbuj biblioteki takie jak Universal Image Loader sugerowane w innych odpowiedziach).
Podziękowania dla Jamesa za kod i Bao-Long za sugestię użycia SoftReference. Zaimplementowałem zmiany SoftReference w kodzie Jamesa. Niestety SoftReferences spowodowało, że moje obrazy były zbyt szybko usuwane. W moim przypadku było dobrze bez elementów SoftReference, ponieważ mój rozmiar listy jest ograniczony, a moje obrazy są małe.
Rok temu była dyskusja na temat SoftRefereferencji w grupach google: link do wątku . Jako rozwiązanie zbyt wczesnego wyrzucania elementów bezużytecznych sugerują możliwość ręcznego ustawienia wielkości sterty maszyny wirtualnej za pomocą dalvik.system.VMRuntime.setMinimumHeapSize (), co nie jest dla mnie zbyt atrakcyjne.
źródło
Picasso
Skorzystaj z biblioteki Picassa Jake'a Whartona. (A Perfect ImageLoading Library od twórcy ActionBarSherlock)
Potężna biblioteka do pobierania i buforowania obrazów dla Androida.
Obrazy nadają aplikacjom na Androida bardzo potrzebny kontekst i wizualny styl. Picasso umożliwia bezproblemowe ładowanie obrazu w aplikacji - często w jednym wierszu kodu!
Picasso często obsługuje wiele typowych pułapek ładowania obrazu na Androida:
Obsługa recyklingu ImageView i anulowania pobierania w adapterze. Złożone transformacje obrazu przy minimalnym zużyciu pamięci. Automatyczne buforowanie pamięci i dysku.
Biblioteka Picassa Jake'a Whartona
Poślizg
Glide to szybka i wydajna platforma zarządzania multimediami typu open source dla systemu Android, która otacza dekodowanie multimediów, pamięć podręczną i pamięć podręczną dysków oraz pule zasobów w prosty i łatwy w użyciu interfejs.
Glide obsługuje pobieranie, dekodowanie i wyświetlanie zdjęć, obrazów i animowanych plików GIF. Glide zawiera elastyczny interfejs API, który pozwala programistom na podłączenie do prawie każdego stosu sieciowego. Domyślnie Glide używa niestandardowego stosu opartego na HttpUrlConnection, ale zawiera także biblioteki narzędziowe podłączone do projektu Volley firmy Google lub biblioteki OkHttp Square.
Głównym celem Glide jest sprawienie, aby przewijanie dowolnej listy obrazów było tak płynne i szybkie, jak to możliwe, ale Glide działa również w prawie każdym przypadku, gdy trzeba pobrać, zmienić rozmiar i wyświetlić zdalny obraz.
Glide Image Loading Library
Fresk przez Facebook
Fresco to potężny system do wyświetlania obrazów w aplikacjach na Androida.
Fresco dba o ładowanie i wyświetlanie obrazu, więc nie musisz. Będzie ładować obrazy z sieci, pamięci lokalnej lub zasobów lokalnych i wyświetlać symbol zastępczy, dopóki obraz nie dotrze. Ma dwa poziomy pamięci podręcznej; jeden w pamięci, a drugi w pamięci wewnętrznej.
Fresk Github
W Androidzie 4.x i starszych Fresco umieszcza obrazy w specjalnym regionie pamięci Androida. Dzięki temu Twoja aplikacja działa szybciej - i znacznie rzadziej cierpi przerażający OutOfMemoryError.
Dokumentacja fresku
źródło
Program ładujący o wysokiej wydajności - po zbadaniu zaproponowanych tutaj metod użyłem rozwiązania Bena z pewnymi zmianami -
Zdałem sobie sprawę, że praca z drawableami jest szybsza niż z mapami bitowymi, więc zamiast tego używam drawable
Korzystanie z SoftReference jest świetne, ale powoduje, że obraz w pamięci podręcznej jest zbyt często usuwany, dlatego dodałem połączoną listę, która zawiera odwołania do obrazów, zapobiegając usunięciu obrazu, dopóki nie osiągnie określonego rozmiaru
Aby otworzyć InputStream, użyłem java.net.URLConnection, który pozwala mi korzystać z pamięci podręcznej (najpierw musisz ustawić pamięć podręczną odpowiedzi, ale to już inna historia)
Mój kod:
źródło
import java.util.Map; import java.util.HashMap; import java.util.LinkedList; import java.util.Collections; import java.util.WeakHashMap; import java.lang.ref.SoftReference; import java.util.concurrent.Executors; import java.util.concurrent.ExecutorService; import android.graphics.drawable.Drawable; import android.widget.ImageView; import android.os.Handler; import android.os.Message; import java.io.InputStream; import java.net.MalformedURLException; import java.io.IOException; import java.net.URL; import java.net.URLConnection;
Przeszedłem szkolenie Android i myślę, że świetnie sobie radzi z pobieraniem obrazów bez blokowania głównego interfejsu użytkownika. Obsługuje również buforowanie i radzenie sobie z przewijaniem wielu obrazów: Wydajne ładowanie dużych map bitowych
źródło
1. Picasso umożliwia bezproblemowe ładowanie obrazu w aplikacji - często w jednym wierszu kodu!
Użyj Gradle:
Tylko jedna linia kodu!
2. Szybkość Biblioteka ładowania i buforowania obrazu dla Androida skupia się na płynnym przewijaniu
Użyj Gradle:
// Dla prostego widoku:
3. Fresk to potężny system do wyświetlania obrazów w aplikacjach na Androida. Fresk dba o ładowanie i wyświetlanie obrazów, więc nie musisz.
Pierwsze kroki z Fresco
źródło
Napisałem samouczek, który wyjaśnia, jak leniwie ładować obrazy w widoku listy. Mówię o szczegółach dotyczących recyklingu i współbieżności. Używam również stałej puli wątków, aby zapobiec pojawianiu się wielu wątków.
Leniwe ładowanie zdjęć w tutorialu Listview
źródło
Robię to, uruchamiając wątek, aby pobrać obrazy w tle i przekazać mu oddzwonienie dla każdego elementu listy. Po zakończeniu pobierania obrazu wywołuje funkcję oddzwaniania, która aktualizuje widok elementu listy.
Ta metoda nie działa jednak zbyt dobrze, gdy przetwarzasz widoki.
źródło
Chcę tylko dodać jeszcze jeden dobry przykład, Adaptery XML . Ponieważ jest używany przez Google i używam tej samej logiki, aby uniknąć błędu OutOfMemory.
Zasadniczo ten ImageDownloader jest twoją odpowiedzią (ponieważ pokrywa większość twoich wymagań). Niektóre można również zaimplementować.
źródło
Jest to powszechny problem w Androidzie, który został rozwiązany na wiele sposobów przez wiele osób. Moim zdaniem najlepszym rozwiązaniem, jakie widziałem, jest stosunkowo nowa biblioteka Picasso . Oto najważniejsze informacje:
Jake Wharton
o ActionBarSherlock sławy.ListView
wykrywanieźródło
Korzystam z NetworkImageView z nowej biblioteki Android Volley Library
com.android.volley.toolbox.NetworkImageView
i wydaje się, że działa całkiem dobrze. Najwyraźniej jest to ten sam widok, który jest używany w Google Play i innych nowych aplikacjach Google. Zdecydowanie warto to sprawdzić.Samouczek pamięci podręcznej siatkówki obrazów Google I / O 2013
Wydarzenia Google dla programistów
źródło
Czas ładowania obrazu z Internetu ma wiele rozwiązań. Możesz także skorzystać z biblioteki Android-Query . Da ci wszystkie wymagane działania. Upewnij się, co chcesz zrobić, i przeczytaj stronę wiki biblioteki. I rozwiń ograniczenie ładowania obrazu.
To jest mój kod:
To powinno rozwiązać twój leniwy problem z ładowaniem.
źródło
Myślę, że ten problem jest bardzo popularny wśród programistów Androida i istnieje wiele takich bibliotek, które twierdzą, że rozwiązują ten problem, ale tylko niektóre z nich wydają się być naznaczone. AQuery jest jedną z takich bibliotek, ale jest lepsza niż większość z nich we wszystkich aspektach i warto spróbować.
źródło
Musisz wypróbować ten uniwersalny moduł ładujący. Używam tego po zrobieniu wielu RnD na leniwe ładowanie.
Universal Image Loader
funkcje
Obsługa Androida 2.0+
źródło
Spójrz na Shutterbug , lekki SDWebImage Applidium (ładna biblioteka na iOS) na Androida. Obsługuje buforowanie asynchroniczne, przechowuje nieudane adresy URL, dobrze obsługuje współbieżność i zawiera przydatne podklasy.
Zgłoszenia ściągania (i zgłoszenia błędów) są również mile widziane!
źródło
DroidParts ma ImageFetcher, który wymaga zerowej konfiguracji, aby rozpocząć.
Klonuj DroidPartsGram na przykład:
źródło
Krótka wskazówka dla kogoś, kto nie może się zdecydować, jakiej biblioteki użyć do leniwego ładowania obrazów:
Istnieją cztery podstawowe sposoby.
DIY => Nie najlepsze rozwiązanie, ale dla kilku zdjęć i jeśli chcesz przejść bez kłopotów z używaniem innych bibliotek
Biblioteka Leniwego ładowania Volleya => Od facetów z Androida. Jest ładny i wszystko, ale jest słabo udokumentowane, a zatem jest problem w użyciu.
Picasso: Proste rozwiązanie, które po prostu działa, możesz nawet określić dokładny rozmiar obrazu, który chcesz wprowadzić. Jest bardzo prosty w użyciu, ale może nie być zbyt „wydajny” w przypadku aplikacji, które mają do czynienia z ogromną ilością obrazów.
UIL: Najlepszy sposób na leniwe ładowanie zdjęć. Możesz buforować obrazy (oczywiście potrzebujesz zgody), zainicjować moduł ładujący raz, a następnie wykonać swoją pracę. Najbardziej dojrzała asynchroniczna biblioteka ładująca obrazy, jaką kiedykolwiek widziałem.
źródło
Novoda ma również świetną bibliotekę do ładowania obrazów, a wiele aplikacji, takich jak Songkick, Podio, SecretDJ i ImageSearch, korzysta z ich biblioteki.
Ich biblioteka znajduje się tutaj na Github, a także mają dość aktywny moduł do śledzenia problemów . Ich projekt wydaje się być również dość aktywny, z ponad 300 zobowiązaniami w momencie pisania tej odpowiedzi.
źródło
Sprawdź mój rozwidlenie LazyList . Zasadniczo poprawiam LazyList opóźniając wywołanie ImageView i tworzę dwie metody:
Ulepszyłem także ImageLoader, implementując singleton w tym obiekcie.
źródło
Jeśli chcesz wyświetlić układ Shimmera jak Facebook, istnieje oficjalna biblioteka Facebooka. FaceBook Shimmer Android
Dba o wszystko, wystarczy umieścić żądany kod projektowy w sposób zagnieżdżony w migotliwej ramce. Oto przykładowy kod.
A oto kod Java.
Dodaj tę zależność do pliku ocen.
Oto jak to wygląda.
źródło
Wszystkie powyższe kody mają swoją wartość, ale z moim osobistym doświadczeniem po prostu spróbuj z Picasso.
Picasso jest biblioteką specjalnie do tego celu, w rzeczywistości automatycznie zarządza pamięcią podręczną i wszystkimi innymi operacjami sieciowymi. Musisz dodać bibliotekę do swojego projektu i po prostu napisać jeden wiersz kodu, aby załadować obraz ze zdalnego adresu URL.
Proszę odwiedzić tutaj: http://code.tutsplus.com/tutorials/android-sdk-working-with-picasso--cms-22149
źródło
Skorzystaj z biblioteki szybownictwa. To zadziałało dla mnie i będzie działać również dla twojego kodu. Działa zarówno z obrazami, jak i gifami.
źródło
Mogę polecić inny sposób, który działa jak urok: Zapytanie na Androida.
Możesz pobrać ten plik JAR stąd
Jako przykład:
Jest bardzo szybki i dokładny, a dzięki temu można znaleźć wiele innych funkcji, takich jak animacja podczas ładowania, uzyskanie mapy bitowej (w razie potrzeby) itp.
źródło
Wypróbuj Aquery . Ma niezwykle proste metody asynchronicznego ładowania i buforowania obrazów.
źródło
URLImageViewHelper to niesamowita biblioteka, która Ci w tym pomaga.
źródło
źródło
Miałem ten problem i zaimplementowałem lruCache. Uważam, że potrzebujesz interfejsu API 12 lub nowszego lub użyj biblioteki kompatybilności v4. lurCache to szybka pamięć, ale ma również budżet, więc jeśli martwisz się, że możesz użyć dyskietki ... Wszystko to opisano w Buforowanie map bitowych .
Przedstawię teraz moją implementację, która jest singletonem, do którego dzwonię z dowolnego miejsca:
Oto idealny kod do buforowania, a następnie wywołania powyższego w getView adaptera podczas pobierania obrazu sieciowego:
źródło