ภาพรวมของไลบรารี Paging   เป็นส่วนหนึ่งของ Android Jetpack

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

ประโยชน์ของการใช้ไลบรารี Paging

ไลบรารีเพจจิ้งมีฟีเจอร์ต่อไปนี้

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

ตั้งค่า

หากต้องการนำเข้าคอมโพเนนต์ Paging ไปยังแอป Android ให้เพิ่มทรัพยากร Dependency ต่อไปนี้ลงในไฟล์ build.gradle ของแอป

Kotlin

dependencies {
  val paging_version = "3.4.2"

  implementation("androidx.paging:paging-common:$paging_version")

  // Jetpack Compose integration
  implementation("androidx.paging:paging-compose:$paging_version")
}

ดึงดูด

dependencies {
  def paging_version = "3.4.2"

  implementation "androidx.paging:paging-common:$paging_version"

  // Jetpack Compose integration
  implementation "androidx.paging:paging-compose:$paging_version"
}

สถาปัตยกรรมห้องสมุด

คอมโพเนนต์ของไลบรารีการแบ่งหน้าจะทำงานใน 3 เลเยอร์ของแอป ดังนี้

  • เลเยอร์ที่เก็บข้อมูล
  • เลเยอร์ ViewModel
  • เลเยอร์ UI
รูปภาพแสดงการไหลของข้อมูลที่มีการแบ่งหน้าจากคอมโพเนนต์ PagingSource หรือ RemoteMediator ในเลเยอร์ที่เก็บไปยังคอมโพเนนต์ Pager ในเลเยอร์ ViewModel
    จากนั้นคอมโพเนนต์ Pager จะแสดง Flow ของ PagingData ไปยังคอมโพเนนต์เลย์เอาต์แบบ Lazy ในเลเยอร์ UI
รูปที่ 1 ตัวอย่างวิธีที่ไลบรารีเพจจิ้งเหมาะกับสถาปัตยกรรมแอปของคุณ

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

เลเยอร์ที่เก็บ

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

คอมโพเนนต์ไลบรารีการแบ่งหน้าอีกรายการที่คุณอาจใช้คือ RemoteMediator ออบเจ็กต์ RemoteMediator จะจัดการการแบ่งหน้าจากแหล่งข้อมูลแบบเลเยอร์ เช่น แหล่งข้อมูลเครือข่ายที่มีแคชฐานข้อมูลในเครื่อง

เลเยอร์ ViewModel

คอมโพเนนต์ Pager มี API สาธารณะสำหรับสร้างอินสแตนซ์ของ PagingData ที่แสดงในสตรีมแบบรีแอ็กทีฟ โดยอิงตามออบเจ็กต์ PagingSource และออบเจ็กต์การกำหนดค่า PagingConfig

คอมโพเนนต์ที่เชื่อมต่อเลเยอร์ ViewModel กับ UI คือ PagingData ออบเจ็กต์ PagingData คือคอนเทนเนอร์สำหรับภาพรวมของข้อมูลที่มีการแบ่งหน้า โดยจะค้นหาออบเจ็กต์ PagingSource และจัดเก็บผลลัพธ์

เลเยอร์ UI

API ของ UI การแบ่งหน้าหลักคือ collectAsLazyPagingItems() โดยจะแสดงรายการที่มีการแบ่งหน้าเป็นรายการข้อมูลที่คอมโพเนนต์เลย์เอาต์แบบ Lazy ของ Compose สามารถนำไปใช้ได้อย่างง่ายดาย เช่น LazyColumn และ LazyRow

เพิ่มไลบรารี androidx.paging:paging-compose เพื่อใช้ API ที่เข้ากันได้กับ Compose ซึ่งช่วยให้ UI ตอบสนองต่อการโหลดข้อมูล การอัปเดต และข้อผิดพลาดโดยอัตโนมัติ โดยไม่ต้องใช้อะแดปเตอร์หรือตรรกะการเปรียบเทียบความแตกต่าง ใช้ฟังก์ชันส่วนขยาย collectAsLazyPagingItems() ใน Flow<PagingData> เพื่อส่ง LazyPagingItems ที่แสดงผลไปยัง items() ใน LazyColumn

@Composable
fun MessageList(pager: Pager<Int, Message>) {
    val lazyPagingItems = pager.flow.collectAsLazyPagingItems()

    LazyColumn {
        items(
            lazyPagingItems.itemCount,
            key = lazyPagingItems.itemKey { it.id }
        ) { index ->
            val message = lazyPagingItems[index]
            if (message != null) {
                MessageRow(message)
            } else {
                MessagePlaceholder()
            }
        }
    }
}

ดูข้อมูลเพิ่มเติมได้ที่ชุดข้อมูลขนาดใหญ่ (การแบ่งหน้า)