โซลูชันแคชรูปภาพในเครื่องสำหรับ Android: Square Picasso, Universal Image Loader, Glide, Fresco?


89

ฉันกำลังมองหาไลบรารีการโหลดและแคชรูปภาพแบบอะซิงโครนัสใน Android ฉันจะใช้ Picasso แต่ฉันพบว่า Universal Image Loader เป็นที่นิยมมากกว่าใน GitHub มีใครรู้เกี่ยวกับห้องสมุดทั้งสองนี้บ้าง? สรุปข้อดีข้อเสียจะดีมาก

(ภาพทั้งหมดของฉันอยู่ในดิสก์ในเครื่องดังนั้นฉันไม่จำเป็นต้องใช้เครือข่ายดังนั้นฉันไม่คิดว่าวอลเลย์จะพอดี)

คำตอบ:


80

อัปเดตกันยายน 2018: หลังจากผ่านไปหลายปีฉันต้องการสิ่งเดียวกันเกือบทั้งหมดสำหรับโซลูชันการแคชรูปภาพในเครื่อง คราวนี้ UIL ยังไม่ได้รับการพัฒนา ฉันเปรียบเทียบไลบรารียอดนิยมและข้อสรุปก็ไม่ง่ายเลยแค่ใช้ Glide มีประสิทธิภาพและกำหนดค่าได้มากกว่า หลายปีก่อนฉันต้องแยกและทำการเปลี่ยนแปลง UIL Glide รองรับกรณีการใช้งานทั้งหมดของฉันในแง่ของกลยุทธ์การแคชและการแคชความละเอียดหลายระดับด้วยคีย์ที่กำหนดเอง เพียงแค่ใช้ Glide!

การเปรียบเทียบของ Koushik Dutta ส่วนใหญ่เป็นเรื่องของมาตรฐานความเร็ว โพสต์ของเขาให้ความสำคัญกับสิ่งพื้นฐานเท่านั้นและไม่เฉพาะเจาะจงสำหรับรูปภาพในท้องถิ่น ฉันต้องการแบ่งปันประสบการณ์ของฉันกับ Picasso และ UIL หลังจากที่ฉันถามคำถามนี้ ทั้ง Picasso และ UIL สามารถโหลดภาพในเครื่องได้ ฉันลองใช้ Picasso ครั้งแรกและมีความสุข แต่ต่อมาฉันตัดสินใจเปลี่ยนไปใช้ UIL เพื่อดูตัวเลือกการปรับแต่งเพิ่มเติม

ปิกัสโซ:

  • อินเทอร์เฟซที่คล่องแคล่วของ Picasso นั้นดี แต่การกระโดดไปรอบ ๆ ด้วย "with", "into", "load" คุณไม่รู้ว่ามีอะไรอยู่เบื้องหลัง มันสับสนว่าอะไรส่งคืน

  • Picasso ช่วยให้คุณระบุขนาดเป้าหมายที่แน่นอน จะมีประโยชน์เมื่อคุณมีปัญหาด้านความจำหรือประสิทธิภาพคุณสามารถแลกคุณภาพของภาพบางส่วนเพื่อความเร็ว

  • รูปภาพจะถูกแคชโดยมีขนาดอยู่ในคีย์ซึ่งจะมีประโยชน์เมื่อคุณแสดงรูปภาพที่มีขนาดแตกต่างกัน

  • คุณสามารถปรับแต่งขนาดแคชหน่วยความจำได้ แต่ดิสก์แคชใช้สำหรับคำขอ http เท่านั้น สำหรับรูปภาพในเครื่องหากคุณสนใจเกี่ยวกับความเร็วในการโหลดคุณควรมีแคชดิสก์รูปขนาดย่อเพื่อที่คุณจะได้ไม่ต้องอ่านหลาย MB สำหรับรูปภาพทุกครั้ง Picasso ไม่มีกลไกนี้ในการปรับขนาดและบันทึกภาพขนาดย่อบนดิสก์

  • Picasso ไม่เปิดเผยการเข้าถึงอินสแตนซ์แคช (คุณสามารถเก็บไว้ได้เมื่อคุณกำหนดค่า Picasso เป็นครั้งแรกและเก็บไว้รอบ ๆ ... )

  • บางครั้งคุณต้องการอ่านภาพแบบอะซิงโครนัสเป็นบิตแมปที่ผู้ฟังส่งคืน น่าแปลกใจที่ Picasso ไม่มีสิ่งนั้น "fetch ()" ปริมาณไม่ส่งกลับอะไรเลย "get ()" ใช้สำหรับอ่านพร้อมกันและ "load ()" ใช้สำหรับวาดมุมมองแบบอะซิงโครนัส

  • Picasso มีเพียงตัวอย่างง่ายๆในหน้าแรกและคุณจะต้องอ่าน javadoc ที่ไม่มีการเรียงลำดับสำหรับการใช้งานขั้นสูง

UIL:

  • UIL ใช้ตัวสร้างสำหรับการปรับแต่ง เกือบทุกอย่างสามารถกำหนดค่าได้

  • UIL ไม่อนุญาตให้คุณระบุขนาดที่คุณต้องการโหลดลงในมุมมอง จะใช้กฎบางอย่างตามขนาดของมุมมอง มันไม่ยืดหยุ่นเท่า Picasso ฉันไม่มีวิธีโหลดภาพที่มีความละเอียดต่ำเพื่อลดการใช้หน่วยความจำ (แก้ไข: พฤติกรรมนี้สามารถแก้ไขได้อย่างง่ายดายโดยการเพิ่มอาร์กิวเมนต์ ImageSize ในซอร์สโค้ดและข้ามการตรวจสอบขนาดมุมมอง)

  • UIL มีแคชดิสก์ที่ปรับแต่งได้คุณสามารถใช้สิ่งนี้เพื่อแคชภาพขนาดย่อตามขนาดที่ระบุ แต่มันไม่สมบูรณ์แบบ นี่เป็นรายละเอียด (แก้ไข: หากคุณสนใจเกี่ยวกับความเร็วและต้องการแคชภาพขนาดย่อหลายระดับเช่นกรณีของฉันคุณสามารถแก้ไขซอร์สโค้ดปล่อยให้แคชของดิสก์ใช้ "memoryKey" และทำให้มีขนาดที่สำคัญด้วย)

  • โดยค่าเริ่มต้น UIL จะแคชรูปภาพที่มีขนาดต่างกันในหน่วยความจำและสามารถปิดได้ในการกำหนดค่า

  • UIL แสดงหน่วยความจำสำรองและดิสก์แคชที่คุณสามารถเข้าถึงได้

  • UIL มีวิธีที่ยืดหยุ่นในการรับบิตแมปหรือโหลดไปยังมุมมอง

  • UIL ดีกว่าในเอกสาร UIL ให้รายละเอียดการใช้งานในหน้า Github และมีบทช่วยสอนที่เชื่อมโยง

ฉันขอแนะนำให้เริ่มต้นด้วย Picasso หากคุณต้องการการควบคุมและปรับแต่งเพิ่มเติมให้ไปที่ UIL


ฉันติดอยู่ระหว่างพวกเขาทั้งสองจริงๆ ... ฉันกำลังจะนำภาพจากเซิร์ฟเวอร์ของฉันกลับมาเก็บไว้ในไดเรกทอรีที่นั่น ... ดังนั้นผ่านการโทร http แล้วเก็บไว้เพื่อแคช (ภาพขนาดย่อและขนาดปกติฉันอาจจะเก็บ ทั้งสองขนาดในไดเรกทอรีของฉัน) ... picasso เป็นวิธีที่จะไปหรือไม่
Lion789

@ Lion789 Picasso ทำแคชหน่วยความจำเฉพาะสำหรับไฟล์ในเครื่องเท่านั้นและใช้ HttpResponseCache สำหรับแคชดิสก์เครือข่ายคุณต้องตรวจสอบสิ่งนั้น UIL มีดิสก์แคชที่กำหนดค่าได้คุณสามารถทำการเปลี่ยนแปลงเล็ก ๆ น้อย ๆ เพื่อให้มันยอมรับขนาดของภาพ / ภาพขนาดย่อที่แตกต่างกัน ลองใช้ Picasso ก่อนถ้าคุณพบว่ามีข้อ จำกัด เกินไปให้ไปที่ UIL และปรับแต่ง
XY

Picasso จึงสามารถโหลดภาพขนาดเล็กลงได้! งั้นก็ไม่ต้องโหลด 8 ล้านพิกเซล! ขอบคุณคุณช่วยฉัน!
Aron Lorincz

คุณช่วยตอบคำถามนี้ได้ไหม stackoverflow.com/questions/35433895/…
Usman Rana

UIL does not allow you to specify the size you want to load into a viewไม่ถูกต้อง 100% .. กับ UIL คุณสามารถใช้ได้public void displayImage(String uri, ImageAware imageAware, DisplayImageOptions options, ImageSize targetSize, ImageLoadingListener listener, ImageLoadingProgressListener progressListener)
Martin Mlostek

72

หากคุณอ่านโพสต์นี้ใน G + by Koush คุณจะได้รับคำตอบที่ชัดเจนสำหรับความสับสนของคุณฉันได้ใส่บทสรุปของสิ่งนั้นไว้ใน Android-Universal-Image-Loader เป็นผู้ชนะตามความต้องการของคุณ!

  • Picassoมี API รูปภาพที่ดีที่สุดหากคุณใช้เครือข่าย!

  • UrlImageViewHelper + AndroidAsyncเร็วที่สุด การเล่นกับไลบรารีที่ยอดเยี่ยมอีกสองแห่งนี้ได้เน้นให้เห็นว่า API รูปภาพค่อนข้างล้าสมัย

  • วอลเลย์เนียน; ฉันสนุกกับการขนส่งแบ็กเอนด์แบบเสียบได้
    และอาจลงเอยด้วยการทิ้ง AndroidAsync ไว้ที่นั่น ลำดับความสำคัญของคำขอ
    และการจัดการการยกเลิกดีมาก (หากคุณใช้เครือข่าย)

  • Android-Universal-Image-Loaderเป็นที่นิยมมากที่สุดใน
    ปัจจุบัน ปรับแต่งได้สูง

โครงการนี้มีวัตถุประสงค์เพื่อจัดหาเครื่องมือที่ใช้ซ้ำได้สำหรับการโหลดภาพแบบอะซิงโครนัสการแคชและการแสดงผล เดิมทีมีพื้นฐานมาจากโครงการของ Fedor Vlasov และได้รับการปรับโครงสร้างและปรับปรุงอย่างมากมายนับตั้งแต่นั้นเป็นต้นมา

การเปลี่ยนแปลงที่กำลังจะเกิดขึ้นใน UIL เวอร์ชันใหม่ (1.9.2):

ความเป็นไปได้ในการเรียก ImageLoader จากเธรด UI ใหม่ Disk Cache API (ยืดหยุ่นกว่า) LruDiscCache ใหม่ที่ใช้ DiskLruCache ของ Jake Wharton

พิจารณาชุดอุปกรณ์ Android-Universal-Image-Loader ทั้งหมดที่คุณต้องการ (การโหลดภาพอยู่ในดิสก์ในเครื่อง )!


ฉันเริ่มต้นกับ Picasso และสิ้นสุดการเปลี่ยนไปใช้ Universal แม้ว่าจะมีการนำทุกอย่างมาใช้อย่างสมบูรณ์ Picasso มีอินเทอร์เฟซ API ที่ดีกว่า แต่ก็มีปัญหามากมาย อันนี้เป็นตะปูสุดท้ายในโลงศพ
Lisandro

45

ฉันอยากจะแบ่งปันประสบการณ์ของฉันกับห้องสมุด 3 แห่งนี้: UIL, Picasso และ Volley ก่อนหน้านี้ฉันเคยใช้ UIL แต่แล้วฉันก็ได้ข้อสรุปว่าฉันไม่สามารถแนะนำได้จริง ๆ และฉันขอแนะนำให้ใช้ Volley หรือ Picasso แทนซึ่งทั้งสองทีมพัฒนาโดยทีมที่มีความสามารถสูง UIL ไม่ได้แย่เลย แต่ขาดความใส่ใจในรายละเอียดของอีกสองไลบรารี

ฉันพบว่า UIL ไม่ค่อยดีกับประสิทธิภาพของ UI มีแนวโน้มที่จะล็อกเธรด UI มากกว่า Volley หรือ Picasso นี่อาจเป็นส่วนหนึ่งเนื่องจาก UIL ไม่สนับสนุนการตอบสนองภาพเป็นชุดในขณะที่ Picasso และ Volley ทำเช่นนั้นโดยค่าเริ่มต้น

นอกจากนี้ฉันไม่ชอบระบบแคชดิสก์ของ UIL ในขณะที่คุณสามารถเลือกระหว่างการใช้งานต่างๆได้ แต่ฉันต้องการชี้ให้เห็นว่าในขณะนี้ไม่มีวิธี จำกัด แคชดิสก์ UIL ทั้งตามขนาดทั้งหมดและตามเวลาหมดอายุของเอนทิตี Volley และ Picasso ทำเช่นนั้นและใช้เวลาหมดอายุที่เซิร์ฟเวอร์ส่งคืนโดยค่าเริ่มต้นในขณะที่ UIL ละเว้น

สุดท้าย UIL อนุญาตให้คุณตั้งค่าการกำหนดค่าตัวโหลดรูปภาพส่วนกลางซึ่งรวมถึงการใช้งานและการตั้งค่าแคชของดิสก์และหน่วยความจำที่เลือกและรายละเอียดอื่น ๆ แต่การกำหนดค่านี้จะถูกนำไปใช้ทุกที่ในแอปของคุณ ดังนั้นหากคุณต้องการความยืดหยุ่นมากขึ้นเช่นดิสก์แคชสองอันที่แยกจากกัน UIL ก็ไม่จำเป็น ในทางกลับกันวอลเลย์ช่วยให้คุณมีตัวโหลดรูปภาพแยกกันได้มากเท่าที่คุณต้องการโดยแต่ละตัวมีการกำหนดค่าของตัวเอง Picasso ใช้อินสแตนซ์ส่วนกลางตามค่าเริ่มต้น แต่ยังให้คุณสร้างอินสแตนซ์ที่กำหนดค่าได้แยกต่างหาก

สรุปได้ว่า Picasso มี API ที่ดีที่สุด แต่ใช้แคชของดิสก์ HTTP ส่วนกลางที่แชร์ระหว่างHttpURLConnectionอินสแตนซ์ทั้งหมดซึ่งอาจ จำกัด เกินไปในบางกรณี Volley มีประสิทธิภาพและความเป็นโมดูลาร์ที่ดีที่สุด แต่ไม่ค่อยเป็นมิตรกับผู้ใช้และจะต้องให้คุณเขียนโมดูลของคุณเองหรือสองโมดูลเพื่อให้ทำงานได้อย่างที่คุณต้องการ โดยรวมแล้วฉันอยากจะแนะนำพวกเขาทั้งสองกับ UIL

แก้ไข (18 ธันวาคม 2014):มีการเปลี่ยนแปลงตั้งแต่ฉันเขียนคำตอบเริ่มต้นนี้และฉันรู้สึกว่าจำเป็นต้องปรับปรุง:

Picasso 2.4 สามารถกำหนดค่าได้มากกว่ารุ่นเก่าและเมื่อใช้กับ OkHttp (ซึ่งแนะนำเป็นอย่างยิ่ง) ยังสามารถใช้ดิสก์แคชแยกกันสำหรับแต่ละอินสแตนซ์ดังนั้นจึงไม่มีข้อ จำกัด ในสิ่งที่คุณทำได้ ที่สำคัญกว่านั้นฉันสังเกตเห็นว่าประสิทธิภาพของ Picasso และ OkHttp นั้นดีขึ้นมากและในความคิดของฉันตอนนี้มันเป็นโซลูชันตัวโหลดรูปภาพที่เร็วที่สุดสำหรับ Android ในช่วงเวลาหนึ่ง โปรดทราบว่าในรหัสของฉันฉันมักจะใช้.fit()ร่วมกับ.centerCrop()หรือ.centerInside()เพื่อลดการใช้หน่วยความจำและหลีกเลี่ยงการปรับขนาดบิตแมปบนเธรด UI Picasso ได้รับการพัฒนาและสนับสนุนอย่างแข็งขันและนั่นเป็นข้อดีอย่างมาก

วอลเลย์ไม่ได้เปลี่ยนไปมากนัก แต่ฉันสังเกตเห็นปัญหาสองประการในระหว่างนี้:

  • บางครั้งภายใต้ภาระงานหนักภาพบางภาพจะไม่ถูกโหลดอีกต่อไปเนื่องจากดิสก์แคชเสียหาย
  • ภาพขนาดย่อที่แสดงใน NetworkImageView (โดยตั้งค่าประเภทมาตราส่วนไว้ที่ centerCrop) ค่อนข้างเบลอเมื่อเทียบกับสิ่งที่คุณได้รับจากไลบรารีอื่น ๆ

ด้วยเหตุผลเหล่านี้ฉันจึงตัดสินใจเลิกใช้วอลเลย์

UIL ยังคงทำงานช้า (โดยเฉพาะดิสก์แคช) และ API มีแนวโน้มที่จะเปลี่ยนแปลงค่อนข้างบ่อย

ฉันยังได้ทดสอบไลบรารีใหม่ชื่อGlide 3ซึ่งอ้างว่าได้รับการปรับให้เหมาะสมกว่า Picasso ด้วย API แบบ Picasso จากประสบการณ์ส่วนตัวของฉันมันช้ากว่า Picasso และ Volley จริง ๆ ในระหว่างการร้องขอเครือข่ายภายใต้ภาระงานหนักแม้ว่าจะใช้ร่วมกับ OkHttp ก็ตาม ที่แย่กว่านั้นคือทำให้แอพของฉันขัดข้องเล็กน้อยใน Lollipop เมื่อออกจากกิจกรรม ยังมีข้อดีเหนือคู่แข่ง 2 ประการ:

  • รองรับการถอดรหัส GIF แบบเคลื่อนไหว
  • มันทำให้บิตแมปลดขนาดสุดท้ายลงในแคชของดิสก์ซึ่งหมายความว่าการอ่านย้อนกลับจากแคชของดิสก์นั้นเร็วมาก

สรุป:ตอนนี้ฉันแนะนำให้ใช้ Picasso + OkHttp เนื่องจากมีความยืดหยุ่น API ประสิทธิภาพและเสถียรภาพที่ดีที่สุดรวมกัน หากคุณต้องการการสนับสนุน GIF คุณสามารถพิจารณา Glide


1
ในการระบุจุดสุดท้ายของคุณใน UIL คุณสามารถสร้างImageLoaderคลาสและการกำหนดค่าต่างๆได้มากเท่าที่คุณต้องการ คุณเพียงแค่ต้อง subclass ImageLoaderคลาส ดูที่นี่: github.com/nostra13/Android-Universal-Image-Loader/issues/…
TalkLittle

ดูเหมือนแฮ็ค แต่ขอบคุณสำหรับเคล็ดลับเป็นสิ่งที่ควรรู้
BladeCoder

3
ไม่สามารถพูดได้ว่าฉันเห็นด้วยกับความรู้สึกเราใช้ Picasso ที่นี่ฉันมีอัลบั้มที่มีภาพความละเอียดสูงมากกว่า 500 ภาพและฉันพบปัญหาด้านประสิทธิภาพและหน่วยความจำลองใช้ UIL และสิ่งต่างๆได้รับการแก้ไขทันที นี่คือตัวอย่างเพียงเล็กน้อยที่แยกปัญหาของเราที่เราพบ
HaMMeReD

หากคุณกำลังแสดงภาพที่มีความละเอียดสูงกว่าหน้าจอหรือภาพขนาดย่อของภาพความละเอียดสูงจำนวนมากคุณควรลดขนาดลงอย่างแน่นอน ฉันคิดว่า UIL ทำสิ่งนี้โดยอัตโนมัติและ Picasso ไม่ได้หากคุณไม่ระบุตัวเลือกที่เหมาะสมดังนั้นปัญหาเกี่ยวกับหน่วยความจำ โดยส่วนตัวแล้วฉันชอบใช้ NetworkImageView ใน Volley เป็นวิดเจ็ตที่ลดขนาดรูปภาพที่โหลดเป็นขนาดของตัวเอง
BladeCoder

ใน UIL คลาส DisplayImageOptions สามารถใช้ได้หากเราไม่ต้องการเปลี่ยนแปลงหรือใช้การประมวลผลอื่น ๆ กับภาพใดภาพหนึ่ง
Rahul Rastogi

7

ฉันได้ติดตั้งแอพที่ควรรับและแสดงรูปภาพจากอินเทอร์เน็ตอยู่ตลอดเวลา ฉันกำลังจะตั้งโปรแกรมกลไกแคชรูปภาพก่อนหน้านั้นมีเพื่อนคนหนึ่งแนะนำตัวโหลดรูปภาพสากลให้ฉัน

UIL สามารถปรับแต่งได้ดีมาก ปรับแต่งได้มากจนมือใหม่สามารถทำอะไรผิดพลาดได้ง่ายๆ อย่างไรก็ตาม UIL ช้าในแอปพลิเคชันของฉันและช้าลงเล็กน้อย กรณีการใช้งานของฉันคือ ListView พร้อมรูปภาพ

เมื่อวานนี้ฉันกำลังมองหาทางเลือกอื่นสำหรับ UIL และฉันได้ค้นพบ Picasso Picasso นั้นง่ายต่อการผสานรวมและใช้งาน: Just Picasso.context(context).load(url).into(imageview)และรูปภาพสามารถรวมได้เร็วขึ้นและราบรื่น

สำหรับฉันแล้ว Picasso เป็น API ที่ต้องใช้ ประสบการณ์ของฉันกับ UIL ไม่ดี


สำหรับผู้อ่านในอนาคต: ดีกว่า picasso คือ Glide ดูได้
therealprashant

0

ฉันคิดว่า ImageLoader สามารถปรับแต่งและยืดหยุ่นได้มากกว่าเมื่อเทียบกับไลบรารี Picasso


8
อย่างไร? คำอธิบายเล็กน้อยจะช่วยได้
Darpan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.