Android data communication with Otto


Warning: in_array() expects parameter 2 to be array, string given in /home/content/31/10462331/html/babedev/blog/wp-content/plugins/facebook-button-plugin/facebook-button-plugin.php on line 380

Warning: in_array() expects parameter 2 to be array, string given in /home/content/31/10462331/html/babedev/blog/wp-content/plugins/facebook-button-plugin/facebook-button-plugin.php on line 383

เริ่มบทความแรก เกี่ยวกับ programming ก่อนเลย เมื่ออาทิตย์ก่อนได้รับข่าวสารจาก androidweekly.net เกี่ยวกับ library ที่ชื่อ Otto

Otto เป็น library ที่ใช้เป็นสื่อกลางในการส่งข้อมูลระหว่าง activity, fragment หรือแม้แต่ background service โดยใช้แนวคิดของ Bus ในการส่งข้อมูล แบบเดียวกับ motherboard บนเครื่องคอมพิวเตอร์ คือเมื่อมีส่วนใดส่วนหนึ่งของระบบปล่อยข้อมูลออกมา มันก็จะวิ่งไปทั่วระบบ

ซึ่งแนวคิดนี้ใน Android development ยังไม่มี (หรืออาจจะมีแต่ผมไม่รู้ -_-“) การจะทำให้ใกล้เคียงสุดคือการสร้าง global variable ใน Application หรือใน Activity ในกรณีที่ใช้ fragment และถ้าต้องการให้มีทำงานแบบ real time คือเมื่อมีการ trigger ส่งข้อมูล แล้วปลายทางต้องได้รับทันที ก็คงต้องสร้าง listener ไว้เพื่อรอรับ และต้องมีการ register อีกยาวเหยียด
พอถึงจุดๆนี้ แค่นึกภาพก็เครียดแล้ว กว่าจะเขียนเสร็จแถม code คงยุบยั่บไปหมด

และนี้คือที่มาของ Otto ที่ใช้ในการแก้ไขปัญหานี้

ถ้างั้นมาเริ่มเลยดีกว่า
ในบทความนี้ผมใช้ Otto version 1.3.5 สามารถ download ได้จาก ที่นี้

ใน application ตัวอย่างนี้ผมจะมี Activity ที่มี fragment ภายใน 1 อัน และมีปุ่มใน activity เพื่อใช้ในการส่งข้อมูลให้ fragment

เริ่มแรกด้วยการสร้าง Bus แบบ Singleton ก่อน

ใน MainActivity ทำการ register ตัว BusProvider

ผมสร้างตัว producer ไว้ใน Activity ซึ่งจะใช้ @Produce เพื่อประกาศว่า method นี้จะใช้ในการ produce ข้อมูล หลังจากนั้นสร้าง POJO ชื่อ ProduceEvent ที่มี field ชื่อ name, value ข้างใน และเมื่อกดปุ่มแล้วจะทำการเรียก .post(produce())

เมื่อ Producer เสร็จแล้ว ก็ต่อด้วย Subscriber ต่อ โดยจะสร้างไว้ใน fragment ซึ่งจะต้องทำการ register Bus แบบเดียวกับ Activity

เมื่อเสร็จแล้ว ก็ใช้ @Subscribe เพื่อประกาศว่า method นี้จะใช้เพื่อรับข้อมูล ถ้ามีการส่ง POJO ที่มี Class เดียวกันมา การจะประกาศเป็น subscriber ได้ต้องเป็น public และมี argument เดียวเท่านั้น

ผลที่ได้ก็จะเป็นตามรูป เมื่อมีการกดปุ่ม Bus จะทำการ produce ข้อมูลส่งไปให้ subscriber ต่างๆ เมื่อ subscriber ได้รับข้อมูลซึ่งมี POJO ที่ถูกต้อง ก็จะนำข้อมูลไปใช้

device-2014-08-10-204224   device-2014-08-10-204233

จากการลองใช้ library นี้ ก็น่าจะเหมาะกับการใช้รับข้อมูลที่มีการอัพเดทตลอดเวลา เช่น ข้อมูล GPS หรือถ้า project มีการใช้ fragment เยอะๆ ก็เหมาะเลย

ก็จบแต่เพียงเท่านี้ รอบหน้าถ้ามีโอกาส จะมาเขียนตัวอย่างการรับข้อมูลจากส่วนอื่นๆ อย่าง service และ thread ครับ

ありがとうございます

  • 5
  •  
  •  

Warning: Missing argument 1 for cwppos_show_review(), called in /home/content/31/10462331/html/babedev/blog/wp-content/themes/flat/content-single.php on line 29 and defined in /home/content/31/10462331/html/babedev/blog/wp-content/plugins/wp-product-review/includes/legacy.php on line 18

Leave a Reply

Your email address will not be published. Required fields are marked *