จาก 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 มาให้ตั้งแต่สร้างระบบงานอยู่แล้ว
ดังนั้นจึงสบายขึ้นเยอะ
แต่ถ้าเป็นระบบเก่า ๆ ก็ต้องใส่เองดังนี้

จากนั้นทำการเพิ่ม dependency ของ Lifecycle Architecture Component
ซึ่งจะมี ViewModel มาให้ด้วยดังนี้

เริ่มเขียน code กันดีกว่า

ขั้นตอนที่ 1 สร้าง interface BookService สำหรับดึงข้อมูลจาก Google Book API

ด้วยการส่ง keyword ที่ต้องการค้นหาผ่าน HTTP GET ดังนี้

ขั้นตอนที่ 2 สร้าง ViewModel ขึ้นมาชื่อว่า BookViewModel

ใช้สำหรับเก็บข้อมูลเพื่อนำไปแสดงผลใน View
ซึ่งในการพัฒนาต้อง extends จาก ViewModel
แน่นอนว่า ภายใน BookViewModel จะมี LiveData
ทำการจัดเก็บข้อมูลที่มาจาก Google Book API

และส่วนการดึงข้อมูลจาก Google Book API ก็อยู่ในส่วนนี้ด้วย
ปล. เป็น code ที่ไม่ดีเลยนะครับ
ต้องทำการแยกออกไปอยู่ใน model จะดีกว่ามาก !!

ขั้นตอนที่ 3 ทำการเรียกใช้งาน ViewModel จาก Activity

ทำการสร้าง BookViewModel ผ่าน ViewModelProviders
จากนั้นทำการดักพังการเปลี่ยนแปลงของข้อมูลผ่าน method observer()

ทำการเปลี่ยน class ที่ extends จาก AppCompatActivity เป็น LifecycleActivity
ส่วน method onSaveInstanceState() ก็ไม่จำเป็นแล้วนะ

ที่สำคัญข้อมูลใน BookViewModel จะยังคงอยู่ใน Lifecycle ของ Activity ให้เลย
ดังนั้นถ้ามีการเปลี่ยนแปลงต่าง ๆ
เช่น Activity มีการสร้างใหม่ จะใช้ข้อมูลล่าสุดที่อยู่ใน Lifecycle ของ Activity
เขียนง่าย ๆ ได้ดังนี้

ปล. ถ้าอยากให้การสร้าง ViewModel ส่วนงามมากขึ้น
แนะนำให้ใช้งาน Factory pattern มาช่วย

เพียงเท่านี้เราก็สามารถนำ ViewModel + LiveData + Activity Lifecycle มาใช้งานได้แล้ว

ส่วน source code ของตัวอย่างอยู่ที่ Github :: Up1 :: Android ViewModel