เข้าใจเรื่อง EventBus ใน 3 นาที

Android Sep 10, 2019

รู้ว่าอ่านเองมันยาก เราเลยสรุปให้ อ่านเสร็จมาม่าสุกพอดี

ถ้าคุณอยากโยนค่าอะไรไปซะอย่าง โดยไม่ต้องรู้จักกัน ขอแค่ส่งไปแล้วได้รับก็พอ
ถ้าคุณอยากโยนค่าอะไรไปซะอย่าง โดยที่ไม่ต้องมานั่ง check ตลอดเวลาให้วุ่นวาย

EventBus เธอคือคำตอบ เพราะอะไรหล่ะ?

สมมุติเราส่งของให้ลูกค้า โดยมีตัวกลางอย่างพี่แมสเป็นคนส่ง ซึ่งตัวกลางอย่างพี่แมสก็ต้องมีระบบรับของจากเราและส่งของไปให้ลูกค้า ทำให้ลูกค้าตามพัสดุจากพี่แมสได้ และรู้ว่าของถึงแล้วเมื่อพี่แมสโทรมาบอก

image

จากในแผนภาพนี้มีการทำงานดังนี้

  1. ตกลงกันก่อนว่าจะส่งอะไร เช่น event ชื่อพัสดุ
  2. จากนั้นคนส่งจะส่ง event โดยการ post
  3. พี่แมสหรือ EventBus รับ event ที่ว่า
  4. พี่แมสเอาไปส่งให้คนรับ
  5. คนรับจะได้รับ event ตอนที่ subscribe เรียบร้อยแล้ว

มาใช้งาน EventBus กันเถอะ

ก่อนอื่น ใส่ลงไปใน dependency เสียก่อน

implementation 'org.greenrobot:eventbus:3.1.1'

อ้างอิงจาก

greenrobot/EventBus
Event bus for Android and Java that simplifies communication between Activities, Fragments, Threads, Services, etc. Less code, better quality. - greenrobot/EventBus

พออ่านๆพบว่าใน 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 ดู พบว่าทำงานได้แล้ว เย้ๆๆๆๆ

อ่านเพิ่มเติม

How to get started with EventBus in 3 steps

Tags

Minseo Chayabanjonglerd

I am a full-time Android Developer and part-time contributor with developer community and web3 world, who believe people have hard skills and soft skills to up-skill to da moon.