Android için yerel görüntü önbelleğe alma çözümü: Square Picasso, Universal Image Loader, Glide, Fresco?


89

Android'de zaman uyumsuz bir resim yükleme ve önbelleğe alma kitaplığı arıyorum. Picasso kullanacaktım ama Universal Image Loader'ın GitHub'da daha popüler olduğunu buldum. Bu iki kütüphaneyi bilen var mı? Artıların ve eksilerin bir özeti harika olurdu.

(Tüm resimlerim yerel olarak diskte olduğundan ağa ihtiyacım yok, bu yüzden Volley'in uygun olduğunu düşünmüyorum)

Yanıtlar:


80

Eylül 2018 Güncellemesi: Birkaç yıl sonra, yerel bir görüntü önbelleğe alma çözümü için neredeyse aynı şeye ihtiyacım vardı. Bu sefer UIL aktif gelişimde değildi. Popüler kütüphaneleri karşılaştırdım ve sonuç oldukça basit: sadece Glide kullanın. Çok daha güçlü ve yapılandırılabilir. Yıllar önce UIL'de çatallanmak ve değişiklikler yapmak zorunda kaldım. Glide, önbelleğe alma stratejisi ve özel anahtarlarla çoklu çözünürlük önbelleğe alma açısından tüm kullanım durumlarımı destekliyor. Glide'ı kullanın!

Koushik Dutta'nın karşılaştırması çoğunlukla hız karşılaştırması içindir. Gönderisi yalnızca çok temel şeylere değindi ve yerel görsellere özgü değil. Soruyu sorduktan sonra deneyimlerimi Picasso ve UIL ile paylaşmak istiyorum. Hem Picasso hem de UIL yerel görüntüleri yükleyebilir. İlk olarak Picasso'yu denedim ve mutluydum, ancak daha sonra daha fazla özelleştirme seçeneği için UIL'e geçmeye karar verdim.

Picasso:

  • Picasso'nun akıcı arayüzü güzel. Ama "ile", "içine", "yükle" ile zıplamak, aslında sahnenin arkasında ne olduğunu bilmiyorsunuz. Neyin döndüğü kafa karıştırıcı.

  • Picasso, tam hedef boyutu belirlemenize izin verir. Bellek baskısı veya performans sorunlarınız olduğunda kullanışlıdır, hız için biraz görüntü kalitesini değiştirebilirsiniz.

  • Görüntüler anahtarında boyut olarak önbelleğe alınır, farklı boyutlardaki görüntüleri görüntülediğinizde kullanışlıdır.

  • Önbellek boyutunu özelleştirebilirsiniz. Ancak disk önbelleği yalnızca http istekleri içindir. Yerel görüntüler için, yükleme hızını önemsiyorsanız, bir küçük resim disk önbelleğine sahip olmak iyidir, böylece her seferinde bir görüntü için birkaç MB okumak zorunda kalmazsınız. Picasso, küçük resimleri yeniden boyutlandıran ve diske kaydeden bu mekanizmaya sahip değildir.

  • Picasso, önbellek örneğine erişimi göstermez. (Picasso'yu ilk yapılandırdığınızda ve etrafta tuttuğunuzda onu elde edebilirsiniz ...).

  • Bazen, bir dinleyici tarafından döndürülen bir bit eşlemde görüntüyü eşzamansız olarak okumak istersiniz. Şaşırtıcı bir şekilde Picasso'nun buna sahip olmaması. "fetch ()" dozu hiçbir şeyi geri vermez. "get ()" eşzamanlı olarak okumak içindir ve "load ()" eşzamansız olarak bir görünüm çizmek içindir.

  • Picasso'nun ana sayfasında yalnızca birkaç basit örneği vardır ve gelişmiş kullanımlar için sırasız javadoc'u okumanız gerekir.

ÜS:

  • UIL, özelleştirme için inşaatçılar kullanır. Hemen hemen her şey yapılandırılabilir.

  • UIL, bir görünüme yüklemek istediğiniz boyutu belirlemenize izin vermez. Görünümün boyutuna göre bazı kurallar kullanır. Picasso kadar esnek değil. Bellek ayak izini azaltmak için daha düşük çözünürlüklü bir görüntü yüklememin bir yolu yok. (Düzenleme: bu davranış, kaynak koduna bir ImageSize argümanı eklenerek ve görünüm boyutu kontrolünü atlayarak kolayca değiştirilebilir)

  • UIL, özelleştirilebilir disk önbelleği sağlar, bunu küçük resimleri belirtilen boyutta önbelleğe almak için kullanabilirsiniz. Ama mükemmel değil. İşte detaylar . (Düzenleme: Hızı önemsiyorsanız ve benim durumum gibi birden çok düzeyde küçük resim önbelleğe alma istiyorsanız, kaynak kodunu değiştirebilir, disk önbelleğinin "memoryKey" kullanmasına izin verebilir ve ayrıca boyuta duyarlı hale getirebilirsiniz)

  • UIL varsayılan olarak farklı boyutlardaki görüntüleri bellekte önbelleğe alır ve konfigürasyonda kapatılabilir.

  • UIL, erişebileceğiniz yedekleme belleğini ve disk önbelleğini açığa çıkarır.

  • UIL, bir bitmap alabileceğiniz veya bir görünüme yükleyebileceğiniz esnek yollar sağlar.

  • UIL, dokümantasyonda daha iyidir. UIL, Github sayfasında ayrıntılı kullanımları verir ve bağlantılı bir eğitim vardır.

Picasso ile başlamanızı öneririm, daha fazla kontrole ve özelleştirmeye ihtiyacınız varsa, UIL'e gidin.


Aslında ikisinin arasında sıkışıp kaldım ... Aslında oradaki bir dizinde depolanan sunucumdan görüntüleri geri getireceğim ... bu yüzden http çağrıları yoluyla ve sonra önbelleğe almak için saklayacağım (küçük resim ve normal boyut, muhtemelen rehberimde her iki beden) ... o zaman Picasso gitmek için bir yol mu?
Lion789

@ Lion789 Picasso, yerel dosyalar için yalnızca yerel bellek önbelleği yapar ve ağ oluşturma disk önbelleği için HttpResponseCache kullanır, buna bakmanız gerekir. UIL yapılandırılabilir disk önbelleğine sahiptir, farklı boyuttaki resimleri / küçük resimleri kabul etmesine izin vermek için bazı küçük değişiklikler yapabilirsiniz. Belki önce Picasso'yu deneyin, çok sınırlı bulursanız, UIL'e gidin ve özelleştirin
XY

Böylece Picasso daha küçük resimler yükleyebilir! O halde 8 megapiksel olanları yüklememe gerek yok! Teşekkürler bana yardım ettin!
Aron Lorincz

Lütfen bu soruya cevap verir misiniz? stackoverflow.com/questions/35433895/…
Usman Rana

UIL does not allow you to specify the size you want to load into a view% 100 doğru değil .. Kullanabileceğiniz UIL ilepublic void displayImage(String uri, ImageAware imageAware, DisplayImageOptions options, ImageSize targetSize, ImageLoadingListener listener, ImageLoadingProgressListener progressListener)
Martin Mlostek

72

Eğer okursanız bu Koush G + 'yazı size karışıklıkları için net çözümler alacak, ben Android Evrensel-Görüntü-Loader sizin gereksinimi için kazanan olması ile, bunun özetini koyduk!

  • Ağ kullanıyorsanız, Picasso en güzel görüntü API'sine sahiptir!

  • UrlImageViewHelper + AndroidAsync en hızlısıdır. Bu diğer iki büyük kitaplıkla oynamak, görüntü API'sinin oldukça eski olduğunu gerçekten vurguladı.

  • Voleybolu kaygandır; Takılabilir arka uç aktarımlarından gerçekten keyif alıyorum
    ve AndroidAsync'i orada bırakabilirim. İstek önceliği
    ve iptal yönetimi harika (ağ kullanıyorsanız)

  • Android Evrensel Görüntü Yükleyici
    şu anda en popüler olanıdır . Son derece özelleştirilebilir.

Bu proje, eşzamansız görüntü yükleme, önbelleğe alma ve görüntüleme için yeniden kullanılabilir bir araç sağlamayı amaçlamaktadır. Başlangıçta Fedor Vlasov'un projesine dayanıyor ve o zamandan beri büyük ölçüde yeniden tasarlandı ve geliştirildi.

Yeni UIL sürümünde (1.9.2) yaklaşan değişiklikler:

ImageLoader'ı UI threadNew Disk Cache API'sinden çağırma imkanı (daha esnek). Jake Wharton'ın DiskLruCache tabanlı yeni LruDiscCache.

Tüm bu Android-Universal-Image-Loader paketlerini göz önünde bulundurarak gereksiniminizi ( Görüntülerin yüklenmesi yerel olarak disktedir )!


Picasso ile başladım ve her şey tam olarak uygulanmasına rağmen Universal'e geçişi bitirdim. Picasso'nun daha iyi bir api arayüzü var ancak birçok sorunu da var. Bu tabutun son çivisiydi.
Lisandro

45

Bu 3 kütüphane ile deneyimlerimi paylaşmak istiyorum: UIL, Picasso ve Volley. Daha önce UIL kullandım ama sonra gerçekten tavsiye edemediğim sonucuna vardım ve onun yerine çok yetenekli takımlar tarafından geliştirilen Volley veya Picasso'yu kullanmanızı öneririm. UIL hiç de fena değil ama diğer iki kütüphanenin detaylarına dikkat etmiyor.

UIL'i UI performansıyla daha az hoş buldum; UI iş parçacığını Volley veya Picasso'dan daha fazla kilitleme eğilimindedir. Bu kısmen, Picasso ve Volley bunu varsayılan olarak yaparken UIL'in görüntü yanıtlarını toplu olarak desteklememesinden kaynaklanıyor olabilir.

Ayrıca, UIL'in disk önbellek sistemini de beğenmedim. Çeşitli uygulamalar arasında seçim mümkün olmakla birlikte, şu anda ÜSİ diski önbellek sınırlamak için hiçbir yol olduğunu işaret etmek gerek her iki toplam boyuta varlık sona erme süresine göre . Volley ve Picasso bunu yapar ve UIL bunu göz ardı ederken sunucu tarafından döndürülen sona erme süresini varsayılan olarak kullanırlar.

Son olarak, UIL, seçilen disk önbelleği ve bellek önbellek uygulamalarını ve diğer ayrıntıları içeren genel bir görüntü yükleyici yapılandırması ayarlamanıza olanak tanır, ancak bu yapılandırma uygulamanızın her yerinde uygulanacaktır. Dolayısıyla, iki ayrı disk önbelleği gibi daha fazla esnekliğe ihtiyacınız varsa, bu UIL için uygun değildir. Öte yandan Volley, her biri kendi konfigürasyonuna sahip, istediğiniz kadar ayrı görüntü yükleyiciye sahip olmanıza olanak tanır. Picasso varsayılan olarak global bir örnek kullanır, ancak ayrıca ayrı ayrı yapılandırılabilir örnekler oluşturmanıza da izin verir.

Özetlemek gerekirse: Picasso en iyi API'ye sahiptir, ancak HttpURLConnectionbazı durumlarda çok kısıtlayıcı olabilen tüm örnekler arasında paylaşılan genel HTTP disk önbelleğini kullanır . Volley en iyi performansa ve modülerliğe sahiptir ancak daha az kullanıcı dostudur ve istediğiniz gibi çalışması için kendi modülünüzden bir veya iki tane yazmanızı gerektirir. Genel olarak ikisini de ÜSİ'ye karşı tavsiye ederim.

Düzenleme (18 Aralık 2014): Bu ilk cevabı yazdığımdan beri işler değişti ve onu iyileştirmenin gerekli olduğunu hissettim:

Picasso 2.4, eski sürümlerden daha da yapılandırılabilirdir ve OkHttp ile birlikte kullanıldığında (ki bu şiddetle tavsiye edilir) ayrıca her örnek için ayrı bir disk önbelleği kullanabilir, böylece yapabilecekleriniz konusunda gerçekten hiçbir kısıtlama yoktur. Daha da önemlisi, Picasso ve OkHttp'nin performansının çok geliştiğini ve bence artık Android için en hızlı resim yükleyici çözümü olduğunu fark ettim . Lütfen kodumda bellek kullanımını azaltmak ve UI iş parçacığında bitmap yeniden boyutlandırmalarından kaçınmak için veya .fit()birlikte kullandığımı unutmayın . Picasso aktif olarak geliştirildi ve desteklendi ve bu kesinlikle büyük bir artı..centerCrop().centerInside()

Voleybol o kadar da değişmedi ama bu arada iki sorunu fark ettim:

  • Bazen ağır yük altında, bazı disk önbelleğinin bozulması nedeniyle bazı görüntüler artık yüklenmez.
  • Bir NetworkImageView'da görüntülenen küçük resimler (ölçek türü centerCrop olarak ayarlanmış olarak), diğer kitaplıklarla elde ettiğinize kıyasla oldukça bulanıktır.

Bu nedenlerden dolayı Voleybolu kullanmayı bırakmaya karar verdim.

UIL hala yavaştır (özellikle disk önbelleği) ve API'sinin oldukça sık değişme eğilimi vardır.

Picasso benzeri bir API ile Picasso'dan daha optimize olduğunu iddia eden Glide 3 adlı bu yeni kitaplığı da test ettim . Kişisel deneyimlerime göre, OkHttp ile birlikte kullanıldığında bile, ağır yük altındaki ağ istekleri sırasında Picasso ve Volley'den daha yavaş. Daha kötüsü, bir etkinlikten çıkarken uygulamalarımın Lollipop altında birkaç çökmesine neden oldu. Rakiplerine göre hala 2 avantajı var:

  • Animasyonlu GIF kod çözmeyi destekler
  • Son ölçeği küçültülmüş bitmap'leri disk önbelleğine koyar, bu da disk önbelleğinden okumanın son derece hızlı olduğu anlamına gelir.

Sonuç: Şimdi Picasso + OkHttp'yi kullanmanızı tavsiye ediyorum çünkü en iyi esnekliği, API'yi, performansı ve kararlılığı bir arada sunuyor. GIF desteğine ihtiyacınız varsa Glide'ı da düşünebilirsiniz.


1
UIL üzerinde son noktayı karşılaşmamak için, olabilir birçok farklı olarak oluşturmak ImageLoaderistediğiniz gibi sınıflar ve yapılandırmalar. Sadece sınıfı alt sınıflara ayırmanız gerekir ImageLoader. Buraya bakın: github.com/nostra13/Android-Universal-Image-Loader/issues/…
TalkLittle

Bir hack gibi görünüyor ama bahşiş için teşekkürler, bilmek güzel.
BladeCoder

3
Düşünceye katılıyorum diyemem, burada Picasso kullanıyoruz, 500'den fazla yüksek çözünürlüklü görsel içeren bir albümüm var ve performans ve hafıza sorunları ile karşılaşıyordum, UIL denedim ve işler anında çözüldü. Bu, gördüğümüz sorunlarımızı izole eden minimal bir örnekti.
HaMMeReD

Ekrandan çok daha yüksek çözünürlüğe sahip görüntüleri veya yüksek çözünürlüklü görüntülerin birçok küçük resmini görüntülüyorsanız, bunları kesinlikle altörneklemelisiniz. Bence UIL bunu otomatik olarak yapıyor ve Picasso doğru seçenekleri belirtmezseniz bunu yapmıyor, dolayısıyla hafıza sorunları. Ben kişisel olarak NetworkImageView'ı Volley'de kullanmayı tercih ediyorum, bu, yüklenen görüntüyü kendi boyutuna indirgeyen bir widget.
BladeCoder

UIL'de, belirli bir görüntüyü değiştirmek veya başka işlemler uygulamak istemiyorsak DisplayImageOptions sınıfı kullanılabilir.
Rahul Rastogi

7

İnternetten sürekli olarak görüntü alması ve göstermesi gereken bir uygulama geliştirdim. Bir görüntü önbellek mekanizması programlamak üzereydim, ondan önce bir arkadaşım bana evrensel görüntü yükleyiciyi önerdi.

UIL çok iyi özelleştirilebilir. O kadar özelleştirilebilir ki, bir acemi bir şeyi kolayca yanlış yapabilir. Ancak, UIL benim başvurumda yavaştı ve biraz daha yavaşladı. Kullanım durumum, resimli bir ListView idi.

Dün ÜSİ'ye bir alternatif arıyordum ve Picasso'yu keşfettim. Picasso'nun entegrasyonu ve kullanımı kolaydı: Sadece Picasso.context(context).load(url).into(imageview)ve görüntü daha hızlı ve sorunsuz bir şekilde entegre edilebilirdi.

Benim için Picasso kesinlikle kullanılacak API. ÜSİ ile ilgili deneyimim iyi değildi.


Gelecekteki okuyucular için: Picasso Glide'dan daha iyidir. Bir göz atın
therealprashant

0

ImageLoader'ın Picasso kitaplığına göre daha özelleştirilebilir ve esnek olduğunu düşünüyorum.


8
Nasıl? küçük bir açıklama yardımcı olacaktır.
Darpan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.