ฉันอยากจะแบ่งปันประสบการณ์ของฉันกับห้องสมุด 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