Picasso, Square şirketi tarafından geliştirilen, Android uygulamalarında görselleri yüklemek için bir kütüphanedir. Kütüphane, ağdan grafikleri yüklemek, önbelleğe almak ve görüntülemek için basit ve anlamlı bir API sağlar. Picasso'nun GitHub istatistiklerine göre, kütüphane 100.000'den fazla kez indirilmiştir. Picasso otomatik olarak belleği yönetir ve görselleri birden çok düzeyde önbelleğe alır.
Önemli Noktalar
Picasso, Square tarafından oluşturulan Android'de eşzamansız görsel yükleme kütüphanesidir. Adını sanatçı Pablo Picasso'dan alır ve kütüphanenin felsefesini yansıtır: karmaşık bir görevi basit ve zarif bir API'ye dönüştürmek. Android topluluğunda görsel yükleme için en popüler kütüphanedir.
Picasso'nun mimarisi minimalisttir: kütüphane yükleme için bir iş parçacığı havuzu, bellek önbelleği için LruCache ve disk önbelleği için DiskLruCache kullanır. Glide'dan farklı olarak Picasso, AppGlideModule yapılandırması gerektirmez ve bağımlılığı ekledikten hemen sonra kullanıma hazırdır. Bu, onu prototipler ve küçük projeler için ideal bir seçim haline getirir.
Picasso 2.8, Android API 21+ ve Java 8+ ile uyumlu en son kararlı sürümdür. Kütüphane, yapılandırma için Gradle eklentileri veya ek açıklamalar gerektirmez, bu da sürümler arası geçişi basitleştirir ve güncellemeler sırasında hata olasılığını azaltır. Uzun geçmişine rağmen Picasso, dünya çapında binlerce projede talep görmeye devam etmektedir.
Picasso'nun ana görevi, URL ile bir görseli yüklemek, kodunu çözmek, gerekirse boyutlandırmak ve bir ImageView'da görüntülemektir. Kütüphane otomatik olarak arka plan iş parçacıklarını, önbelleği ve listelerde ImageView yeniden kullanımını yönetir.
2013'te piyasaya sürülmesinden bu yana Picasso, Android topluluğunda görsel yükleme standardı haline gelmiştir. Kütüphane, minimum giriş eşiği sayesinde (ilk kullanım için yalnızca bir satır kod) binlerce uygulamada kullanılmaktadır.
Picasso'daki öncelikler, görsellerin yükleme sırasını yönetmeye olanak tanır. Varsayılan olarak tüm istekler normal önceliğe sahiptir, ancak kritik görseller için priority yöntemiyle yüksek öncelik ayarlanabilir. Bir ImageView yeniden kullanıldığında (örneğin RecyclerView'da), Picasso otomatik olarak önceki isteği iptal eder ve yenisini başlatır, kaydırma sırasında görsel titreşmesini önler.
Picasso, gereksiz karmaşıklık olmadan mobil uygulamalarda görsellerle çalışmanın ana senaryolarını kapsayan bir dizi özellik sunar.
Picasso'nun önbelleği iki düzeyden oluşur: hızlı erişim için RAM ve kalıcı depolama için disk. Bir görsel talep edildiğinde, kütüphane önce bellek önbelleğini, ardından diski kontrol eder ve ancak ondan sonra ağ isteği yapar. Bu, tekrar tekrar yüklenen görsellerin görüntülenmesini önemli ölçüde hızlandırır.
Dönüşümler, her seferinde orijinali kodu çözmeden bir görseli yeniden boyutlandırma, kırpma veya döndürme olanağı sağlar. Picasso, yerleşik CenterCrop ve CenterInside dönüşümlerini sunar ve Transformation arayüzü aracılığıyla özel dönüşümler oluşturmaya da izin verir. Dönüştürülmüş görseller ayrı olarak önbelleğe alınır.
Placeholder, görsel ağdan yüklenirken görüntülenir ve kullanıcıya görsel geri bildirim sağlar. Yükleme başarısız olduğunda bir hata görseli gösterilir. Picasso ayrıca yeni bir sürüm yüklenene kadar görüntülenen bir görseli de destekler; bu, güncellenebilir avatarlar için kullanışlıdır.
Picasso, URL'lerden, kaynaklardan, dosyalardan, içerik sağlayıcılarından ve URI'lerden görsel yüklemeyi destekler. load() yöntemi tüm bu türler için aşırı yüklenmiştir ve kütüphane kaynağı otomatik olarak belirler. Kaynaklar ve dosyalar için Picasso ağ isteği yapmaz, doğrudan veriyi yükler; bu, yerleşik grafiklerin görüntülenmesini hızlandırır.
Picasso, RequestCreator ve Dispatcher tabanlı bir mimari kullanır. Her istek Picasso.get().load() ile oluşturulur ve bir iş parçacığı havuzunda yürütülür. Dispatcher, istek kuyruğunu, öncelikleri ve ImageView yeniden kullanıldığında iptali yönetir.
into(view) çağrıldığında Picasso, URL, dönüşümler, hedef ve geri arama içeren bir Action nesnesi oluşturur. Action, Dispatcher kuyruğuna yerleştirilir. Motor, görseli Downloader (varsayılan olarak OkHttp) aracılığıyla yükler, Bitmap'in kodunu çözer, dönüşümleri uygular ve sonucu UI iş parçacığına teslim eder. Tüm görseller otomatik olarak ImageView boyutuna sığdırılır.
Picasso.get()
.load("https://example.com/image.jpg")
.placeholder(R.drawable.placeholder)
.error(R.drawable.error)
.resize(400, 300)
.centerCrop()
.into(imageView)
Picasso kurulumu Gradle aracılığıyla yapılır. Kütüphane Maven Central üzerinden dağıtılır ve karmaşık yapılandırma gerektirmez. Minimum Android API sürümü 21'dir.
Modül düzeyindeki build.gradle dosyasına implementation ‘com.squareup.picasso:picasso:2.8’ ekleyin. Gradle senkronizasyonundan sonra Picasso kullanıma hazırdır. Ağ işlemleri için Picasso, projede varsa otomatik olarak OkHttp'yi, yoksa yerleşik HttpURLConnection'ı kullanır.
dependencies {
implementation "com.squareup.picasso:picasso:2.8"
}
// OkHttp'den yüklemek için Kafka (isteğe bağlı)
implementation "com.squareup.okhttp3:okhttp:4.12.0"
Picasso'nun hata ayıklama göstergesi, her görselin köşesinde renkli bir üçgen gösterir: ağ yükleme için kırmızı, disk önbelleği için mavi, bellek önbelleği için yeşil. Picasso örneğinde setIndicatorsEnabled(true) çağrılarak etkinleştirilir. Varsayılan önbellek boyutu, cihazın kullanılabilir belleğinin %15'idir.
Özel bir Picasso örneği yapılandırmak için Picasso.Builder'ı kullanın. Arka plan iş parçacıkları için Executor, ağ istekleri için Downloader, MemoryCache ve DiskCache ayarlamanıza olanak tanır. Özel bir örnek, özellikle Downloader'ın ağ isteği olmadan görsel döndüren bir saplama ile değiştirilebildiği testlerde kullanışlıdır.
Aşağıdaki örnekler, Picasso ile çalışmanın tipik senaryolarını göstermektedir: basit bir görsel yükleme, dönüşümleri kullanma ve RecyclerView'da yükleme.
ImageView'a temel yükleme tek bir çağrıyla yapılır. Picasso, scaleType'ı dikkate alarak görseli otomatik olarak görünümün boyutlarına sığdırır. Yükleme tamamlanana kadar bir placeholder gösterilir ve bağlantı hatası durumunda bir hata görseli görüntülenir.
Picasso.get()
.load("https://example.com/photo.jpg")
.placeholder(R.drawable.loading)
.error(R.drawable.broken_image)
.fit()
.centerCrop()
.into(imageView)
BlurTransformation, görseli belirtilen bir yarıçapla bulanıklaştırır. Özel dönüşümler, transform yöntemiyle Transformation arayüzünü uygular. Önbellek, dönüşüm sonucunu benzersiz bir anahtar altında saklayarak tekrar uygulanmasını önler.
public class BlurTransformation implements Transformation {
@Override
public Bitmap transform(Bitmap source) {
Bitmap blurred = Bitmap.createBitmap(source);
RenderScript rs = RenderScript.create(context);
// bulanıklaştırma uygulama
source.recycle();
return blurred;
}
@Override
public String key() {
return "blur";
}
}
RecyclerView'da Picasso, ekran dışına kaydırılan ImageView'lar için istekleri otomatik olarak iptal eder ve zaten yüklenmiş görselleri yeniden kullanır. Bu, bellek sızıntılarını önler ve yumuşak kaydırma sağlar.
public void onBindViewHolder(ViewHolder holder, int position) {
String url = items.get(position).getImageUrl();
Picasso.get()
.load(url)
.fit()
.centerCrop()
.into(holder.imageView);
}
Android için görsel yükleme kütüphanesi seçerken Picasso ve Glide karşılaştırması sık sorulan bir sorudur. Her iki kütüphane de aynı görevi çözer ancak farklı önceliklere ve kullanım özelliklerine sahiptir.
Picasso, basitlik ve minimum APK boyutunun önemli olduğu projeler için daha uygundur. Glide, GIF desteği, video kareleri ve maksimum bellek optimizasyonu gerektiğinde seçilir. Glide, görseli otomatik olarak tam ImageView boyutuna ölçeklendirir ve bazı senaryolarda Picasso'ya kıyasla bellek tüketimini %50'ye kadar azaltır.
Performans testlerinde Glide, ön yükleme mekanizması ve hızlı kaydırma sırasında otomatik istek iptali sayesinde RecyclerView ile çalışırken daha iyi sonuçlar gösterir. Picasso daha basit bir strateji kullanır, bu da onu öngörülebilir ancak büyük veri hacimlerinde daha az verimli kılar.
Picasso, API basitliğine ve minimum boyuta odaklanır. Glide daha geniş işlevsellik sunar: GIF'ler, canlandırılmış görseller, video kareleri ve yaşam döngüsü entegrasyonu desteği. Glide ayrıca ImageView boyutuna otomatik ölçeklendirme sayesinde belleği daha verimli yönetir.
| Kriter | Picasso | Glide |
|---|---|---|
| Kütüphane Boyutu | ~120 KB | ~500 KB |
| GIF Desteği | Hayır | Evet |
| Video Kareleri | Hayır | Evet |
| Geliştirici | Square | Google (Bumptech) |
| API | Fluent zincir | RequestBuilder |
Android Developer Relations'a göre Google, yeni projelerde görsel yükleme için Glide'ı tercih edilen kütüphane olarak önermektedir. Picasso, GIF'lerin ve video karelerinin gerekli olmadığı basit projeler için mükemmel bir seçim olmaya devam etmektedir.
Sıkça Sorulan Sorular
Picasso boyut olarak daha küçük ve kullanımı daha kolaydır. Glide, GIF'leri ve video karelerini destekler, belleği daha verimli yönetir ve Google tarafından önerilir. Seçim, projenin ek formatlara olan ihtiyacına bağlıdır.
Picasso önbelleğini temizlemek için tek bir görsel için Picasso.get().invalidate(url) yöntemini veya tam temizlik için shutdown() kullanın. Disk önbelleği, uygulama yeniden yüklendiğinde veya sistem ayarları aracılığıyla silinir.
Picasso ekran dönüşüne bağlı değildir. Yüklenen görseller önbellekte saklanır ve Activity yeniden oluşturulduğunda önbellekten görüntülenir. Hızlandırmak için, yüklenen verileri korumak üzere Picasso ile birlikte ViewModel kullanın.
Evet, Picasso Kotlin ile tamamen uyumludur. Kotlin geliştiricileri daha kısa sözdizimi için genişletme işlevlerini kullanabilir veya görsel yüklerken null değerleri işlemek için koptional kütüphanesini uygulayabilir.
Picasso, bellek önbelleği için LruCache kullanır ve kullanılmayan görselleri otomatik olarak temizler. Varsayılan önbellek boyutu, uygulamanın kullanılabilir belleğinin %15'idir. Bellek düşük olduğunda Picasso, onTrimMemory aracılığıyla kaynakları serbest bırakır.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun