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