[Android] สถาปัตยกรรมของแอนดรอยด์ ตอนที่ 2 : Live Data

Jedsada Tiwongvorakul
20Scoops CNX
Published in
2 min readJun 15, 2017

บางครั้งที่เราต้องการที่จะแยกคลาสเพื่อแยกการทำงานออกไป และต้องการอยากจะให้การทำงานนั้นๆ เป็นไปตาม Lifecycle ของ Activity/Fragment/Service ที่เรากำหนด ซึ่งต้องใช้การ Handling Lifecycles ในแบบใหม่ และถ้าหากต้องการที่จะรับค่าจากการทำงานดังกล่าว โดยที่ไม่ต้องสร้าง Callback เองล่ะ วันนี้เจ้าของบล็อคจะพามาทำความรู้จักกับเจ้า Live Data ซึ่งเจ้านี้แหละเป็นคำตอบ

LiveData คือ Data Holder ที่ทำงานร่วมกับ Lifecycle ของ Activity/Fragment/ Service และมีลักษณะการทำงานเป็น Observer ที่คอยสังเกตการณ์การเปลี่ยนแปลงของข้อมูล ถ้าหากใครเคยได้สัมผัสกับ RxJava มาก่อนก็คงคุ้นเคยกันดีอยู่แล้ว

จากตัวอย่างในบทความที่ [Android] สถาปัตยกรรมของแอนดรอยด์ ตอนที่ 1 เป็นการเรียกใช้งาน Location ที่เจ้าของบล็อคได้นำเอาการจัดการ Lifecycles ในแบบใหม่เข้ามาช่วย และในบทความนี้เจ้าของบล็อคจะนำเอาโค้ดตัวเก่ามาทำให้อยู่ในรูปของ Live Data เพื่อให้เห็นภาพการทำงานของ Live Data มากขึ้น 😎

เริ่มจากคลาส MyLocationManager.java ให้ทำการ extends คลาส LiveData<T> โดยจะเห็นว่าต้องระบุ Generic Type ของ Object เข้าไปว่านี้คือข้อมูลที่เราต้องการ Observer เป็นอะไรโดยในที่นี้ข้อมูลแบบ Location ก็จะได้ดังนี้

โดยในคลาสนี้จะเห็นว่าเจ้าของบล็อคมีการ Override method ของ Live Data ออกมาด้วยกัน 2 ตัว ได้แก่

onActive() คือ method จะเริ่มการทำงานเมื่อ Lifecycle เข้าสู่สถานะที่พร้อมใช้งานได้แก่ onResume() หรือ onStart() เพื่อทำการสังเกตการณ์

onInActive() คือ method จะเริ่มทำงานเมื่อไม่มีผู้สังเกตการณ์ใช้งานอยู่หมายความว่า Lifecycle เข้าสู่สถานะ onPause(), onStop() และ onDestrory() นั่นเอง และจะทำการลบผู้สังเกตการณ์ให้เองโดยอัตโนมัติ

เมื่อไรก็ตามที่ Location มีการเปลี่ยน onLocationChange(Location location) ก็จะทำงานอันนี้พอเดาได้เนาะ ก็ให้ทำการกำหนดค่าให้กับเจ้า Live Data โดยผ่านคำสั่งที่ชื่อว่า setValue(Location value); แค่นี้เราก็ได้ทำการเก็บข้อมูลบน Live Data เรียบร้อยแล้ว

มาถึงขั้นตอนการเรียกใช้งาน เจ้าของบล็อคเรียกใช้งานผ่าน Activity ก็จะได้ดังนี้

ในคลาส MainActivity.java เจ้าของบล็อคได้ทำการขอ Permission ของการเข้าถึง Location ผู้ใช้ และเมื่อผู้ใช้อณุญาตก็จะเรียกใช้งาน MyLocationManager.java โดยทำการเรียกใช้งานผ่านคำสั่งที่ชื่อว่า

observe(LifecycleOwner owner, Observer<Location> observer)

มาทำความเข้าใจกับ Argument ที่ต้องส่งกันสักหน่อยว่ามันคืออะไร

  • LifecycleOwner คือ Activity/Fragment ที่ต้องทำการสืบทอดมากจากคลาส LifecycleActivity/LifecycleFragment หรือเป็น Activity/Fragment ที่ต้อง Implement LifecycleRegistry Owner เอง เท่านั้น ซึ่ง MainActivity.java ของเจ้าของบล็อคได้ทำการ สืบทอดมาจาก LifecycleActivity อยู่แล้วจึงสามารถโยน MainActivity.this เข้าไปได้
  • Observer คือ ผู้สังเกตการณ์การเปลี่ยนแปลงค่า ของ Live Data หมายความว่าถ้าหากข้อมูลของ Location มีการเปลี่ยนแปลง แล้วเราทำการกำหนดค่าให้กับ Live Data โดยใช้คำสั่ง setValue(Location value); เมื่อไร method ที่ชื่อว่า onChanged(Location location) ก็จะทำงานโดยอัตโนมัติแล้วจะโยนค่าของ Location ล่าสุดออกมาให้เรา

สรุป

Live Data นั้นสามารถทำงานร่วมกับ Lifecycle ได้โดยอัตโนมัติ เพื่อเข้าช่วยแก้ปัญหาจากเรื่อง Handling Lifecycles เพราะเจ้า Live Data ผูกชีวิตไว้กับ Lifecycle ที่เรากำหนดจึงทำให้มันรู้ได้เองว่าจะเกิดตอนไหนและตายตอนไหน เพื่อลดความผิดพลาดของการจัดการกับ Lifecycle เพราะ Live Data ทำการจัดการให้แล้ว ทำให้เราไปโพกัสอยู่ที่ onActvie() กับ onInActive() และการกำหนดค่าแทน และทำงานที่เป็นแบบ Observer ทำให้เราไม่ต้องมานั่งเขียน Callback เองอีกด้วย ชาบูครับ!!! 🔥

--

--