เข้าใจเรื่อง EventBus ใน 3 นาที
รู้ว่าอ่านเองมันยาก เราเลยสรุปให้ อ่านเสร็จมาม่าสุกพอดี
ถ้าคุณอยากโยนค่าอะไรไปซะอย่าง โดยไม่ต้องรู้จักกัน ขอแค่ส่งไปแล้วได้รับก็พอ
ถ้าคุณอยากโยนค่าอะไรไปซะอย่าง โดยที่ไม่ต้องมานั่ง check ตลอดเวลาให้วุ่นวาย
EventBus เธอคือคำตอบ เพราะอะไรหล่ะ?
สมมุติเราส่งของให้ลูกค้า โดยมีตัวกลางอย่างพี่แมสเป็นคนส่ง ซึ่งตัวกลางอย่างพี่แมสก็ต้องมีระบบรับของจากเราและส่งของไปให้ลูกค้า ทำให้ลูกค้าตามพัสดุจากพี่แมสได้ และรู้ว่าของถึงแล้วเมื่อพี่แมสโทรมาบอก
จากในแผนภาพนี้มีการทำงานดังนี้
- ตกลงกันก่อนว่าจะส่งอะไร เช่น event ชื่อพัสดุ
- จากนั้นคนส่งจะส่ง event โดยการ post
- พี่แมสหรือ EventBus รับ event ที่ว่า
- พี่แมสเอาไปส่งให้คนรับ
- คนรับจะได้รับ event ตอนที่ subscribe เรียบร้อยแล้ว
มาใช้งาน EventBus กันเถอะ
ก่อนอื่น ใส่ลงไปใน dependency เสียก่อน
implementation 'org.greenrobot:eventbus:3.1.1'
อ้างอิงจาก
พออ่านๆพบว่าใน README.md อ่านแล้วจะงงๆเพราะไม่ได้บอกถึงขารับ ดังนั้นสรุปการใช้งานดังน้ี
กำหนด Event ที่จะรับ อาจจะสร้าง model class มาตัวนึง เช่น
class MessageEvent(val message: String)
ฝั่งขาส่ง อยากจะส่งอะไรก็ใช้เจ้า post พร้อมแนบ event ไปด้วย เช่น
EventBus.getDefault().post(MessageEvent("ReceivedGoods"))
ฝั่งขารับ เราต้อง register มันก่อน มักจะใส่กันที่ onCreate()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
EventBus.getDefault().register(this)
}
และ unregister ด้วย มักจะใส่ที่ onDestroy()
override fun onDestroy() {
super.onDestroy()
EventBus.getDefault().unregister(this)
}
จากนั้นฝั่งขารับสร้าง function เพื่อ Subscribe Event ที่เราจะรับ โดยการใส่เจ้า @Subscribe
และตามด้วย threadMode
ข้อควรระวัง function ที่รับ Event นั้น ต้อง public เท่านั้น ไม่งั้นแอป crash เพราะมันหาไม่เจอจ้า
@Subscribe(threadMode = ThreadMode.MAIN)
fun onMessageEvent(event: MessageEvent) {
...
}
ลองเอาไป run ดู พบว่าทำงานได้แล้ว เย้ๆๆๆๆ