2012-12-02 5 views
6

GridView'a bazı görüntüleri yüklemem gereken bir Android projesinde çalışıyorum. Önbellek eksikse görüntüler önbellekte olabilir ve Internet sunucusunu sorgulayabilir. Tasarımım, yükleme görevini yapmak için iki iş parçacığı kullanmaktır. Önbellek okumak için bir iş parçacığı ve indirme için bir iş parçacığı. Yani UI bir dahil olmak üzere 3 iş parçacığı vardır. Her birinin kendi mesaj kuyruğu vardır ve iletişim kurmak için Handler'ı kullanır.Bir şey indirirken sınırlanmış bir hizmet veya özelleştirilmiş iş parçacığı olsun?

Sorum şu, bu durumda ilişkili hizmeti kullanmam gerekip gerekmediğimi mi? Aslında yukarıdaki tasarımı fark ettim ve yanlış bir şey yok ama GC çok sıkı çalışıyor, bu da logcat'ten çıkarılabilir.

Başka bir konu, konuları izlemek için DDMS kullandığımda birkaç iş parçacığının bulunmasıdır. Bunun nedeni, çeşitli yükleme işlemlerinde aynı yükleme mekanizmasının kullanılmasıdır. Konuların onPause() çağrılırken ileti döngüsünü bırakmasına izin verdim, eminim ki sadece ikisi aynı anda yaşıyor. Ama hepsini DDMS'de görebiliyorum. (BTW, iş parçacığı hala var mı? Ben iş parçacığı null = null;)

Bir sözcükte, sorum şu: Bu yükleme görevi bir sınır hizmetinden yararlanabilir mi?

cevap

1

Neden birden çok iş parçacığı kullanıyorsunuz? Arka planda bir resim yüklemeniz gerekir ve tamamlandığında, kullanıcı arayüzünde görüntüleyin. Görüntülerin nereden geldiği UI için gerçekten önemli değil. Birden fazla iş parçacığı kullanmak daha hızlı yapmaz, sadece daha fazla bellek tüketir. Sadece tek bir arka plan iş parçacığı kullanın: önce önbelleğe çarpar, sonra vurulmazsa indirir.

Hizmetler, bir UI'ye gerek duymayan bir şey yapmak istediğiniz zaman içindir. UI'yi gerçek zamanlı olarak güncellemeniz gerekiyorsa, bir servis çok anlamlı değildir.

+0

Cevabınız için teşekkür ederiz. Ancak önbelleğe alma ve indirme için bir arka plan iş parçacığı yeterli değildir. Bu şekilde, önceki indirme görevleri tamamlanana kadar önbellekteki bir resim yüklenmeyecek. İki arkaplan-thread tasarımında, bir görüntü önbellekte bulunuyorsa mümkün olan en kısa sürede yüklenebilir. Bildiğim kadarıyla, 'Bound Service' aktiviteyle iletişim kurmak için kullanılabilir. Bu iletişim iki taraflı olabilir, dolayısıyla teorik olarak bu duruma bir sınırlama hizmeti uygulanır. Ama merak ettiğim şey, bağlı hizmetin daha verimli olup olmadığı. – Alley003

+0

Bir hizmet hiçbir şekilde özel değildir: iş parçacığı çalıştırmak istiyorsanız, bunları oluşturmanız gerekir. Durumunuz için, birden fazla (ancak bağlı) yükleme iş parçacığına sahip olmak isteyebilirsiniz, böylece işleri daha hızlı bir şekilde alabilirsiniz. Bunu yapan açık kaynak kitaplıkları vardır ve IIRC AOSP kodunda bazı örnekler vardır. Her durumda, burada kullanmak için bir hizmet yoktur. –

+0

İşte çok iyi bir tane: https://github.com/novoda/ImageLoader. Kaynağı kontrol ederseniz, bunun önemsiz olmadığını göreceksiniz ve yeniden keşfetmeye çalışmak yerine bir kütüphane kullanmak isteyebilirsiniz. Tavsiyeniz için –

İlgili konular