Android Architecture Components — Part4 : Demo
Table of Contents
- Part 1 — Introduction
- Part 2 — Data Layer
- Part 3 — Presentation Layer
- Part 4 — Demo <- You are here
- Part 5 — Addendum
Show Off
มาถึงช่วงโชว์ความสามารถของ LiveData
และ ViewModel
ที่เราเอามาใช้กันแล้ว เริ่มด้วย LiveData
ก่อนเลยนะครับ
LiveData
ผมจะแสดงให้เห็นว่าเมื่อเรา observe data ด้วย LiveData
เมื่อ data เปลี่ยนแล้วเราจะได้ข้อมูล push มาให้โดยอัตโนมัติยังไง ถ้าคุณโหลดโปรเจคมาจาก Github แล้วนะครับให้ลองเข้าไปที่คลาส PostDetailActivity
ตรงฟังก์ชัน getPostDetail()
แล้ว uncomment บรรทัดที่เรียกใช้ฟังก์ชัน modifyPostFromOtherThread()
// TODO : uncomment and then observe result. modifyPostFromOtherThread(it)
ถ้าแอบเข้าไปดูเนื้อฟังก์ชัน modifyPostFromOtherThread()
จะเห็นว่าผมไปอัพเดทข้อมูล Post
ที่แสดงผลอยู่โดยใช้ Background Thread เพื่อเป็นการจำลองเหตุการณ์ที่ข้อมูลโดนอัพเดทจากแหล่งอื่นในขณะที่เรากำลัง observe LiveData
และนี่คือผลลัพธ์ที่เกิดขึ้น
จากภาพจะเห็นว่าพอเราเข้าไปในหน้า Post Detail (หน้าที่ 2) แล้วรอประมาณ 3 วินาที จากนั้นข้อมูล Post ก็โดนแก้เป็น “← Hacked by Black Lens Crew →” ซึ่งเป็นผลจากการอัพเดทข้อมูล Post จริงๆ ใน Database ผ่าน Background Thread ในฟังก์ชัน modifyPostFromOtherThread()
ทันทีที่ข้อมูลใน database โดนแก้ LiveData
ที่เรา observe อยู่ก็ได้อัพเดททันที ดังจะเห็นจากที่ UI ก็แสดงผลข้อมูลใหม่ให้อัตโนมัติ นอกจากนั้นพอเรากดปุ่ม back กลับไปที่หน้า Post List เราก็จะเห็นว่า title ของ Post
ที่โดนแก้ก็ถูกอัพเดทโดยอัตโนมัติเช่นกัน เนื่องจากหน้า Post List ก็ observe LiveData
ที่ดึงข้อมูล Post ทั้งหมดมาแสดง
Cool ชิมิ :-D
ViewModel
คิวโชว์ออฟคนต่อไปก็คือ ViewModel
คราวนี้ผมจะแสดงให้ดูว่า ViewModel
รอดพ้นจาก Activity
re-create ได้ยังไง โดยผมได้แอบใส่ debug log ไว้ใน PostListActivity
ซึ่งจะพิมพ์ออกคอนโซลว่า “onCreate” ทุกครั้งที่ฟังก์ชัน onCreate()
โดนเรียก (ครั้งแรกที่เปิด Activity
)
จากนั้นใน onCreate()
ก็จะเรียกฟังก์ชัน getAllPosts()
ของ PostListViewModel
ที่จะพิมพ์ออกคอนโซลออกมาว่าฟังก์ชันนี้โดนเรียกไปกี่ครั้งแล้ว โดยเก็บจำนวนครั้งในตัวแปรที่ชื่อ counter
ซึ่งกำหนดให้ค่าเริ่มต้นเป็นศูนย์
สมมติฐานการทดลองครั้งนี้ก็คือทุกครั้งที่เราหมุนจอนั้น PostListActivity
จะ re-create ตัวเอง (onDestroy()
-> onCreate()
) แล้วไปเรียกฟังก์ชัน getAllPosts()
ใน PostListViewModel
ซึ่งจะทำการบวกค่า counter
ขึ้นครั้งละหนึ่งและพิมพ์ออกมาทางคอนโซล แต่ถ้าค่า counter
พิมพ์ออกมาทางคอนโซลว่ามีค่าเป็นหนึ่งเสมอ แสดงว่ามันโดนรีเซตค่าและเท่ากับว่า PostListViewModel
ถูกสร้างขึ้นมาใหม่ ไม่รอดจากกระบวนการ re-create ของ Activity
และนี่คือผลการทดลอง
จากผลลัพธ์จะเห็นนะครับว่า counter ใน PostListViewModel
โดนเพิ่มค่าไปเรื่อยๆ ไม่ได้ถูกรีเซตใหม่แม้ว่า PostListActivity
จะถูก re-create ตอนที่จอหมุนก็ตาม ที่เป็นอย่างนี้ก็เพราะว่าเราได้ instance ของ PostListViewModel
อันเดิมตอนที่เราเรียกมาจาก ViewModelProviders
ใน PostListActivity
ด้วยคำสั่ง
ViewModelProviders.of(this).get(PostListViewModel::class.java)
นี่ก็แสดงว่า PostListViewModel
ของเรารอดพ้นจากการที่ Activity เกิดการ re-create ครับ
ส่วนใน part 5 ซึ่งเป็น part สุดท้ายจะมีโค้ดในส่วน Dependency Injection, แนวทางการปรับปรุงและพัฒนาแอป Posts Reader ให้ดีขึ้นและรวมลิงค์อ่านเพิ่มเติมครับ