Android Architecture Components — Part4 : Demo

Dew
Black Lens
Published in
2 min readJun 20, 2017

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

และนี่คือผลลัพธ์ที่เกิดขึ้น

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 เพิ่มค่าขึ้นไปเรื่อยๆ แสดงว่า ViewModel ไม่ได้ถูกสร้างใหม่ตอนที่ Activity โดน re-create

จากผลลัพธ์จะเห็นนะครับว่า 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 ให้ดีขึ้นและรวมลิงค์อ่านเพิ่มเติมครับ

--

--