จาก Architecture Component สำหรับ Android app
ที่ทางทีมพัฒนาของ Google ประกาศออกมาในงาน Google I/O 2017 ที่ผ่านมา
ดังนั้น เรามาลองใช้งานแบบง่าย ๆ ก่อนดีกว่า
แน่นอนว่า ต้องเขียน code กันนิดหน่อย
โดยสิ่งที่เลือกใช้ประกอบไปด้วย
- ActivityLifeCycle
- ViewModel
- LiveData
- Retrofit
ระบบที่พัฒนาขึ้นมานั้น ทำการค้นหาหนังสือจาก Google Book API
ซึ่งเป้าหมายหลักของระบบประกอบไปด้วย- ใช้งาน ViewModel
- ใช้งาน LiveData สำหรับเก็บข้อมูลเพื่อใช้ใน ViewModel
- ใช้งาน ActivityLifeCycle สำหรับจัดการเรื่องการเปลี่ยนแปลง configuration ต่าง ๆ
- ไม่จำเป็นต้องใช้ method onSaveInstanceState() อีกต่อไป
ปล. code ตัวอย่างนี้ส่วนการดึงข้อมูลด้วย Retrofit ยังทำการ hardcode ไว้ใน ViewModel ซึ่งไม่ดีนะครับ !!การพัฒนาใช้ Android Studio 3 Canary 2 ซึ่งเพิ่ม Maven Google Repository มาให้ตั้งแต่สร้างระบบงานอยู่แล้ว ดังนั้นจึงสบายขึ้นเยอะ แต่ถ้าเป็นระบบเก่า ๆ ก็ต้องใส่เองดังนี้ [gist id="9601ce2c2c0f7cff95d2f121a6325a48" file="build.gradle"] จากนั้นทำการเพิ่ม dependency ของ Lifecycle Architecture Component ซึ่งจะมี ViewModel มาให้ด้วยดังนี้ [gist id="9601ce2c2c0f7cff95d2f121a6325a48" file="app.build.gradle"] เริ่มเขียน code กันดีกว่า
ขั้นตอนที่ 1 สร้าง interface BookService สำหรับดึงข้อมูลจาก Google Book API
ด้วยการส่ง keyword ที่ต้องการค้นหาผ่าน HTTP GET ดังนี้ [gist id="9601ce2c2c0f7cff95d2f121a6325a48" file="BookService.java"]ขั้นตอนที่ 2 สร้าง ViewModel ขึ้นมาชื่อว่า BookViewModel
ใช้สำหรับเก็บข้อมูลเพื่อนำไปแสดงผลใน View ซึ่งในการพัฒนาต้อง extends จาก ViewModel แน่นอนว่า ภายใน BookViewModel จะมี LiveData ทำการจัดเก็บข้อมูลที่มาจาก Google Book API และส่วนการดึงข้อมูลจาก Google Book API ก็อยู่ในส่วนนี้ด้วย ปล. เป็น code ที่ไม่ดีเลยนะครับ ต้องทำการแยกออกไปอยู่ใน model จะดีกว่ามาก !! [gist id="9601ce2c2c0f7cff95d2f121a6325a48" file="BookViewModel.java"]ขั้นตอนที่ 3 ทำการเรียกใช้งาน ViewModel จาก Activity
ทำการสร้าง BookViewModel ผ่าน ViewModelProviders จากนั้นทำการดักพังการเปลี่ยนแปลงของข้อมูลผ่าน method observer() ทำการเปลี่ยน class ที่ extends จาก AppCompatActivity เป็น LifecycleActivity ส่วน method onSaveInstanceState() ก็ไม่จำเป็นแล้วนะ ที่สำคัญข้อมูลใน BookViewModel จะยังคงอยู่ใน Lifecycle ของ Activity ให้เลย ดังนั้นถ้ามีการเปลี่ยนแปลงต่าง ๆ เช่น Activity มีการสร้างใหม่ จะใช้ข้อมูลล่าสุดที่อยู่ใน Lifecycle ของ Activity เขียนง่าย ๆ ได้ดังนี้ [gist id="9601ce2c2c0f7cff95d2f121a6325a48" file="MainActivity.java"]ปล. ถ้าอยากให้การสร้าง ViewModel ส่วนงามมากขึ้น แนะนำให้ใช้งาน Factory pattern มาช่วยเพียงเท่านี้เราก็สามารถนำ ViewModel + LiveData + Activity Lifecycle มาใช้งานได้แล้ว ส่วน source code ของตัวอย่างอยู่ที่ Github :: Up1 :: Android ViewModel