หลีกเลี่ยงการดาวน์โหลดที่ไม่ได้เพิ่มประสิทธิภาพ

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

วิธีพื้นฐานที่สุดในการลดปริมาณการดาวน์โหลดคือการดาวน์โหลดเฉพาะสิ่งที่คุณ ความต้องการ ในแง่ของข้อมูล ซึ่งหมายถึงการใช้ REST API ที่ช่วยให้คุณดำเนินการ ระบุเกณฑ์การค้นหาที่จำกัดข้อมูลที่แสดงผลโดยใช้พารามิเตอร์ เช่น เวลาในการอัปเดตครั้งล่าสุดของคุณ

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

แคชการตอบกลับของ HTTP

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

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

เพื่อให้แน่ใจว่าการแคชของคุณจะไม่ส่งผลให้แอปแสดงข้อมูลเก่า ให้ทำดังนี้ ใช้รหัสสถานะ HTTP ที่เหมาะสมและ ส่วนหัว เช่น ETag และ Last-Modified ส่วนหัว ซึ่งจะช่วยให้คุณระบุได้ว่าเมื่อใดที่ควรใช้เนื้อหาที่เกี่ยวข้อง รีเฟรชแล้ว เช่น

Kotlin

// url represents the website containing the content to place into the cache.
val conn: HttpsURLConnection = url.openConnection() as HttpsURLConnection
val currentTime: Long = System.currentTimeMillis()
val lastModified: Long = conn.getHeaderFieldDate("Last-Modified", currentTime)

// lastUpdateTime represents when the cache was last updated.
if (lastModified < lastUpdateTime) {
    // Skip update
} else {
    // Parse update
    lastUpdateTime = lastModified
}

Java

// url represents the website containing the content to place into the cache.
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
long currentTime = System.currentTimeMillis();
long lastModified = conn.getHeaderFieldDate("Last-Modified", currentTime);

// lastUpdateTime represents when the cache was last updated.
if (lastModified < lastUpdateTime) {
    // Skip update
} else {
    // Parse update
    lastUpdateTime = lastModified;
}

คุณสามารถกำหนดค่าไลบรารีเครือข่ายบางรายการให้ปฏิบัติตามรหัสสถานะเหล่านี้และ ส่วนหัวโดยอัตโนมัติ เมื่อใช้ OkHttp เช่น การกำหนดค่า ไดเรกทอรีของแคชและขนาดแคชสำหรับไคลเอ็นต์จะทำให้ไลบรารีสามารถใช้ การแคช HTTP ดังที่แสดงในตัวอย่างโค้ดต่อไปนี้

Kotlin

val cacheDir = Context.getCacheDir()
val cacheSize = 10L * 1024L * 1024L // 10 MiB
val client: OkHttpClient = OkHttpClient.Builder()
    .cache(Cache(cacheDir, cacheSize))
    .build()

Java

File cacheDir = Context.getCacheDir();
long cacheSize = 10L * 1024L * 1024L; // 10 MiB
OkHttpClient client = new OkHttpClient.Builder()
    .cache(new Cache(cacheDir, cacheSize))
    .build();

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

คุณสามารถแคชข้อมูลที่ไม่ใช่ข้อมูลที่ละเอียดอ่อนในไดเรกทอรีแคชภายนอกที่ไม่มีการจัดการได้โดยทําดังนี้ โดยใช้ Context.getExternalCacheDir() อีกวิธีหนึ่งคือ คุณสามารถแคชข้อมูลในแคชของแอปพลิเคชันที่มีการจัดการและปลอดภัยโดย โดยใช้ Context.getCacheDir() โปรดทราบว่าแคชภายในนี้อาจถูกล้างเมื่อระบบทำงานได้เหลือน้อย พื้นที่เก็บข้อมูลที่มีอยู่

ใช้ที่เก็บ

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