کتابخانه EventBus در اندروید
در پروژههای اندرویدی، مدیریت ارتباط بین بخشهای مختلف اپلیکیشن (مثل Activity، Fragment، Service و ViewModel) یکی از چالشهای رایج است. وقتی این ارتباطها پیچیده میشوند، استفاده از الگوهای سنتی مثل Interface یا Callback میتواند کد را شلوغ و سختنگهداری کند.
در اینجا کتابخانه EventBus وارد عمل میشود؛ یک راهکار سبک و قدرتمند برای پیادهسازی ارتباط Publish/Subscribe در اپلیکیشنهای اندروید.
🎯 EventBus چیست؟
EventBus یک کتابخانه متنباز است که توسط greenrobot توسعه داده شده و به شما اجازه میدهد بین بخشهای مختلف اپلیکیشن، بدون وابستگی مستقیم، داده رد و بدل کنید.
به زبان ساده:
- یک بخش Event ارسال میکند (Publisher)
- بخشهای دیگر آن را دریافت میکنند (Subscriber)
🚀 چرا از EventBus استفاده کنیم؟
✅ مزایا:
- کاهش وابستگی بین کلاسها (Loose Coupling)
- سادهتر شدن ارتباط بین کامپوننتها
- کاهش Boilerplate Code
- سرعت بالا و سبک بودن
❌ معایب:
- سختتر شدن دیباگ
- احتمال ایجاد باگهای پنهان
- مناسب نبودن برای پروژههای بزرگ بدون معماری مشخص
📦 نصب EventBus
در فایل build.gradle:
implementation 'org.greenrobot:eventbus:3.3.1'
⚙️ مفاهیم اصلی
1. تعریف Event
یک کلاس ساده برای انتقال داده:
data class MessageEvent(val message: String)
2. ارسال Event (Publish)
EventBus.getDefault().post(MessageEvent("Hello EventBus"))
3. دریافت Event (Subscribe)
@Subscribe(threadMode = ThreadMode.MAIN)
fun onMessageEvent(event: MessageEvent) {
textView.text = event.message
}
4. ثبت و لغو ثبت
override fun onStart() {
super.onStart()
EventBus.getDefault().register(this)
}
override fun onStop() {
super.onStop()
EventBus.getDefault().unregister(this)
}
🧵 ThreadMode در EventBus
EventBus به شما اجازه میدهد مشخص کنید Event در چه Threadی اجرا شود:
MAIN→ روی UI ThreadBACKGROUND→ در Thread پسزمینهASYNC→ کاملاً غیرهمزمانPOSTING→ همان Thread ارسالکننده
🔄 انواع Event
Sticky Event
برای نگهداشتن آخرین Event:
EventBus.getDefault().postSticky(MessageEvent("Sticky Message"))
دریافت:
@Subscribe(sticky = true)
fun onStickyEvent(event: MessageEvent) {
// دریافت حتی اگر بعداً register شده باشد
}
🎯 مثال واقعی
فرض کنید در یک Activity کاربر لاگین میکند و باید به Fragment اطلاع داده شود:
data class LoginEvent(val userId: String)
در Activity:
EventBus.getDefault().post(LoginEvent("123"))
در Fragment:
@Subscribe(threadMode = ThreadMode.MAIN)
fun onLogin(event: LoginEvent) {
loadUserProfile(event.userId)
}
🧠 نکات مهم حرفهای
❗ حتما unregister کنید
در غیر این صورت Memory Leak رخ میدهد.
❗ استفاده بیش از حد نکنید
EventBus نباید جایگزین کامل معماری شود.
❗ نامگذاری Eventها
واضح و قابل فهم باشد (مثلاً: UserLoggedInEvent)
🆚 جایگزینهای مدرن
امروزه در معماریهای جدید اندروید، ابزارهای بهتری هم وجود دارند:
- LiveData
- Kotlin Flow
- RxJava
این ابزارها:
- قابل پیشبینیتر هستند
- با معماری MVVM سازگارترند
- تستپذیری بهتری دارند
⚖️ چه زمانی از EventBus استفاده کنیم؟
✅ مناسب:
- پروژههای کوچک تا متوسط
- ارتباط سریع بین ماژولهای جدا
- وقتی نمیخواهید وابستگی مستقیم ایجاد کنید
❌ نامناسب:
- پروژههای بزرگ با معماری پیچیده
- وقتی نیاز به Debug ساده دارید
- وقتی از MVVM + Flow استفاده میکنید
🏁 جمعبندی
کتابخانه EventBus یک ابزار ساده و سریع برای مدیریت ارتباط بین اجزای مختلف اپلیکیشن اندروید است. با استفاده از الگوی Publish/Subscribe میتوانید کدهای تمیزتر و کموابستهتری بنویسید.
با این حال، در پروژههای مدرن پیشنهاد میشود از ابزارهایی مثل Kotlin Flow یا LiveData استفاده کنید تا ساختار پروژه شما قابل نگهداریتر باشد.