Picasso: การโหลดรูปภาพและการทำงานในแอปพลิเคชัน Android

ผู้แต่ง: IT Sectr เผยแพร่เมื่อ: 2026-05-05 เวลาอ่าน: 8 นาที

Picasso คือไลบรารีสำหรับโหลดรูปภาพในแอปพลิเคชัน Android ที่พัฒนาโดย Square ไลบรารีให้ API ที่เรียบง่ายและมีประสิทธิภาพสำหรับการโหลด แคช และแสดงกราฟิกจากเครือข่าย ตาม สถิติ GitHub ของ Picasso ไลบรารีถูกดาวน์โหลด มากกว่า 100,000 ครั้ง Picasso จัดการหน่วยความจำอัตโนมัติและเก็บแคชรูปภาพในหลายระดับ

ข้อมูลสำคัญ

  • Picasso — ไลบรารีโหลดรูปภาพจาก Square ด้วย API ง่ายๆ สำหรับ Android
  • แคช บนดิสก์และในหน่วยความจำลดเวลาโหลดรูปภาพที่ซ้ำ
  • การแปลง Crop, Resize และ Rotate ใช้กับรูปภาพได้ทันที
  • Placeholder และรูปภาพข้อผิดพลาดจะแสดงระหว่างโหลดและเมื่อเกิดข้อผิดพลาด
  • ลำดับความสำคัญ ของการโหลดช่วยจัดการลำดับการแสดงรูปภาพ

Picasso คืออะไร

Picasso คือไลบรารีสำหรับการโหลดรูปภาพแบบไม่อยู่กับเวลาใน Android ที่สร้างโดย Square ชื่อนี้ตั้งตามศิลปินปาบโล ปีกาซโซ สะท้อนปรัชญาของไลบรารี: เปลี่ยนงานที่ซับซ้อนให้กลายเป็น API ที่เรียบง่ายและสุภาพ มันเป็นไลบรารีที่ได้รับความนิยมมากที่สุดในการโหลดรูปภาพในชุมชน Android

สถาปัตยกรรมของ Picasso เป็นแบบ น้อยที่สุด: ไลบรารีใช้เธรดพูลสำหรับการโหลด, LruCache สำหรับแคชในหน่วยความจำ และ DiskLruCache สำหรับแคชบนดิสก์ ต่างจาก Glide, Picasso ไม่ต้องการกำหนดค่า AppGlideModule และพร้อมใช้งานทันทีหลังจากเพิ่มการพึ่งพา ทำให้มันเป็นตัวเลือกที่เหมาะสำหรับโปรโตรไทป์และโครงการขนาดเล็ก

Picasso 2.8 เป็นเวอร์ชันที่มั่นคงล่าสุด รองรับ Android API 21+ และ Java 8+ ไลบรารีไม่ต้องการ กำหนดค่า ปลั๊กอืน Gradle หรือคำอธิบาย ซึ่งทำให้การย้ายระหว่างเวอร์ชันง่ายขึ้นและลดความเป็นไปได้ของข้อผิดพลาดระหว่างการอัพเดต แม้จะมีประวัติศาสตร์ที่ยาวนาน, Picasso ยังคงเป็นที่ต้องการในโครงการนับพันโครงการทั่วโลก

งานหลักของ Picasso คือการโหลดรูปภาพตาม URL, ถอดรหัส, เปลี่ยนขนาดหากจำเป็น และแสดงใน ImageView ไลบรารีจัดการเธรดพื้นหลัง แคช และการใช้ ImageView ซ้ำในรายการโดยอัตโนมัติ

ตั้งแต่เปิดตัวในปี 2013, Picasso ได้กลายเป็นมาตรฐานสำหรับการโหลดรูปภาพในชุมชน Android ไลบรารีถูกใช้ในแอปพลิเคชันนับพันโดยอาศัยขอบเกณฑ์การเข้าใช้งานที่ต่ำที่สุด — ต้องใช้โค้ดเพียงหนึ่งบรรทัดสำหรับการใช้ครั้งแรก

ลำดับความสำคัญและการยกเลิกคำขอ

ลำดับความสำคัญ ใน Picasso ช่วยจัดการลำดับการโหลดรูปภาพ โดยปกติคำขอทั้งหมดมีลำดับความสำคัญปกติ แต่สำหรับรูปภาพที่สำคัญสามารถตั้งค่าลำดับความสำคัญสูงโดยวิธี priority หาก ImageView ถูกใช้ซ้ำ (เช่น ใน RecyclerView), Picasso จะยกเลิกคำขอก่อนหน้าโดยอัตโนมัติและเริ่มใหม่ป้องกันการกระพริบของรูปภาพขณะเลื่อนสครอล

คุณสมบัติหลักของ Picasso

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

แคชหลายระดับ

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

การแปลงรูปภาพ

การแปลง ช่วยให้สามารถเปลี่ยนขนาด ตัด หรือหมุนรูปภาพโดยไม่ต้องถอดรหัสต้นฉบับทุกครั้ง Picasso มีการแปลงแบบในตัว CenterCrop และ CenterInside และยังสามารถสร้างการแปลงแบบกำหนดเองได้ผ่านอินเตอร์เฟส Transformation รูปภาพที่ผ่านการแปลงแล้วจะถูกแคชแยกต่างหาก

Placeholder และรูปภาพข้อผิดพลาด

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

การโหลดจากแหล่งที่มากมาย

Picasso รองรับการโหลดรูปภาพจาก URL, ทรัพยากร, ไฟล์, ตัวให้บริการเนื้อหา และ URI เมธอด load() ถูกโอเวอร์โหลดสำหรับทุกประเภทนี้ และไลบรารีจะกำหนดแหล่งที่มาโดยอัตโนมัติ สำหรับทรัพยากรและไฟล์ Picasso จะไม่ทำคำขอเครือข่ายแต่โหลดข้อมูลโดยตรง ซึ่งเร่งการแสดงกราฟิกที่ติดตั้งมา

Picasso ทำงานอย่างไร

Picasso ใช้สถาปัตยกรรมที่อิงตาม RequestCreator และ Dispatcher แต่ละคำขอถูกสร้างผ่าน Picasso.get().load() และดำเนินการในเธรดพูล Dispatcher จัดการคิวคำขอ ลำดับความสำคัญ และการยกเลิกเมื่อ ImageView ถูกใช้ซ้ำ

สถาปัตยกรรมของคำขอ

เมื่อเรียก into(view) Picasso จะสร้างออบเจกต์ Action ที่มี URL, การแปลง, เป้าหมาย และ callback Action จะถูกวางในคิว Dispatcher เเฮลเกินจะโหลดรูปภาผ่าน Downloader (OkHttp โดยปกติ) ถอดรหัส Bitmap ใช้การแปลง และส่งผลลัพธ์ไปยัง UI เธรด รูปภาพทั้งหมดจะถูกปรับให้เข้ากับขนาด ImageView โดยอัตโนมัติ

java
Picasso.get()
    .load("https://example.com/image.jpg")
    .placeholder(R.drawable.placeholder)
    .error(R.drawable.error)
    .resize(400, 300)
    .centerCrop()
    .into(imageView)

การติดตั้งและกำหนดค่า Picasso

การติดตั้ง Picasso ทำผ่าน Gradle ไลบรารีจัดจำหน่ายผ่าน Maven Central และไม่ต้องการการกำหนดค่าที่ซับซ้อน รุ่นต่ำสุดของ Android API คือ 21

การเพิ่มการพึ่งพา

ในไฟล์ build.gradle ระดับโมดูล ให้เพิ่ม implementation ‘com.squareup.picasso:picasso:2.8’ หลังจากการซิงโครนาย์ Gradle แล้ว Picasso ก็พร้อมใช้งาน สำหรับการทำงานกับเครือข่าย Picasso จะใช้ OkHttp โดยอัตโนมัติหากมีอยู่ในโครงการ หรือ HttpURLConnection ที่ติดตั้งมา

groovy
dependencies {
    implementation "com.squareup.picasso:picasso:2.8"
}

// Kafka สำหรับโหลดจาก OkHttp (ไม่บังคับ)
implementation "com.squareup.okhttp3:okhttp:4.12.0"

ตัวบ่งการแก้ไขข้อผิดพลาดและแคช

ตัวบ่ง การแก้ไขข้อผิดพลาดของ Picasso จะแสดงรูปสามเหลี่ยมสีในมุมของแต่ละรูปภาพ: สีแดงสำหรับการโหลดผ่านเครือข่าย, สีน้ำเงินสำหรับแคชบนดิสก์, สีเขียวสำหรับแคชในหน่วยความจำ เปิดใช้งานโดยการเรียก setIndicatorsEnabled(true) บนอินสแตนซ์ Picasso ขนาดแคชโดยปกติคือ 15% ของหน่วยความจำที่ใช้งานได้ของอุปกรณ์

สำหรับการกำหนดค่าอินสแตนซ์ แบบกำหนดเอง ของ Picasso ให้ใช้ Picasso.Builder ซึ่งสามารถตั้ง Executor สำหรับเธรดพื้นหลัง, Downloader สำหรับคำขอเครือข่าย, MemoryCache และ DiskCache อินสแตนซ์แบบกำหนดเองมีประโยชน์โดยเฉพาะในการทดสอบ โดยสามารถแทนที่ Downloader ด้วย stub ที่ส่งคืนรูปภาพโดยไม่ต้องใช้คำขอเครือข่าย

ตัวอย่างการใช้งาน Picasso

ตัวอย่าง ด้านล่างแสดงสถานการณ์ทั่วไปของการทำงานกับ Picasso: การโหลดรูปภาพง่ายๆ, การใช้การแปลง และการโหลดใน RecyclerView

การโหลดรูปภาพใน ImageView

การโหลด พื้นฐานใน ImageView ทำได้ด้วยการเรียกเดียว Picasso จะปรับรูปภาพให้เข้ากับขนาดของ view โดยคำนึงถึง scaleType Placeholder จะแสดงจนกว่าการโหลดจะสำเร็จ และรูปภาพข้อผิดพลาดจะแสดงเมื่อเกิดข้อผิดพลาดการเชื่อมต่อ

java
Picasso.get()
    .load("https://example.com/photo.jpg")
    .placeholder(R.drawable.loading)
    .error(R.drawable.broken_image)
    .fit()
    .centerCrop()
    .into(imageView)

การใช้การแปลงแบบกำหนดเอง

BlurTransformation ทำให้รูปภาพเบลอตามรัศมีที่กำหนด การแปลงแบบกำหนดเองจะใช้อินเตอร์เฟส Transformation กับเมธอด transform แคชจะเก็บผลลัพธ์ของการแปลงภายใต้คีย์ที่ไม่ซ้ำเพื่อไม่ต้องใช้ซ้ำ

java
public class BlurTransformation implements Transformation {
    @Override
    public Bitmap transform(Bitmap source) {
        Bitmap blurred = Bitmap.createBitmap(source);
        RenderScript rs = RenderScript.create(context);
        // การใช้เบลอ
        source.recycle();
        return blurred;
    }

    @Override
    public String key() {
        return "blur";
    }
}

การโหลดรูปภาพใน RecyclerView

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

java
public void onBindViewHolder(ViewHolder holder, int position) {
    String url = items.get(position).getImageUrl();
    Picasso.get()
        .load(url)
        .fit()
        .centerCrop()
        .into(holder.imageView);
}

Picasso vs Glide: เปรียบเทียบไลบรารี

การเปรียบเทียบ Picasso และ Glide เป็นคำถามที่พบบ่อยเมื่อเลือกไลบรารีโหลดรูปภาพสำหรับ Android ทั้งสองไลบรารีแก้ปัญหาเดียวกันแต่มีลำดับความสำคัญและลักษณะการใช้งานที่แตกต่างกัน

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

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

Picasso มุ่งเน้นที่ ความง่ายของ API และขนาดที่เล็กที่สุด Glide มีฟังก์ชันที่กว้างกว่า: รองรับ GIF, รูปภาพเคลื่อนไหว, เฟรมวิดีโอ และการรวมกับวงจรชีวิต Glide ยังจัดการหน่วยความจำได้อย่างมีประสิทธิภาพมากขึ้นเนื่องจากการปรับขนาดอัตโนมัติให้เหมาะกับขนาด ImageView

เกณฑ์PicassoGlide
ขนาดไลบรารี~120 KB~500 KB
รองรับ GIFไม่ใช่
เฟรมวิดีโอไม่ใช่
ผู้พัฒนาSquareGoogle (Bumptech)
APIลูกโซ่ FluentRequestBuilder

ตาม Android Developer Relations Google แนะนำ Glide เป็นไลบรารีที่ต้องการสำหรับการโหลดรูปภาพในโครงการใหม่ Picasso ยังเป็นตัวเลือกที่ยอดเยี่ยมสำหรับโครงการที่ไม่ต้องการ GIF และเฟรมวิดีโอ

คำถามที่พบบ่อย

Picasso แตกต่างจาก Glide อย่างไร

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

วิธีล้างแคช Picasso

ในการ ล้าง แคช Picasso ให้ใช้เมธอด Picasso.get().invalidate(url) สำหรับรูปภาพเดียว หรือ shutdown() สำหรับการล้างทั้งหมด แคชบนดิสก์จะถูกลบเมื่อติดตั้งแอปใหม่หรือผ่านการตั้งค่าระบบ

Picasso จัดการหมุนหน้าจออย่างไร

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

ใช้ Picasso ใน Kotlin ได้หรือไม่

ได้ Picasso เข้ากันได้อย่างสมบูรณ์กับ Kotlin นักพัฒนา Kotlin สามารถใช้ extension ฟังก์ชันเพื่อไวยากรณ์ที่กระชับยิ่งขึ้น หรือใช้ไลบรารี koptional เพื่อจัดการค่า null เมื่อโหลดรูปภาพ

Picasso จัดการหน่วยความจำอย่างไร

Picasso ใช้ LruCache สำหรับแคชในหน่วยความจำ จะล้างรูปภาพที่ไม่ใช้งานโดยอัตโนมัติ ขนาดแคชโดยปกติคือ 15% ของหน่วยความจำที่ใช้งานได้ของแอป เมื่อหน่วยความจำต่ำ Picasso จะปลอยทรัพยากรผ่าน onTrimMemory

สรุป

  • Picasso — ไลบรารีโหลดรูปภาพน้ำหนักแบบเบาๆ จาก Square ด้วย API ที่น้อยที่สุด
  • แคช บนดิสก์และในหน่วยความจำด้วยการจัดการขนาดอัตโนมัติ
  • การแปลง CenterCrop, CenterInside และแบบกำหนดเองผ่านอินเตอร์เฟส Transformation
  • Placeholder และรูปภาพข้อผิดพลาดสำหรับประสบการณ์ผู้ใช้ที่เรียบนิ่ม
  • การยกเลิก คำขอโดยอัตโนมัติใน RecyclerView ป้องกันการโหลดที่ไม่จำเป็น
  • ตัวบ่ง การแก้ไขข้อผิดพลาดช่วยระบุแหล่งที่มาของรูปภาพได้อย่างเป็นภาพ
  • ขนาดไลบรารี เพียง 120 KB — ผลกระทบน้อยที่สุดต่อขนาด APK

เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร

IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ

ปรึกษาโครงการ

อ่านเพิ่มเติม