برنامه‌نویسی اندروید

کتابخانه EventBus در اندروید

کتابخانه 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 Thread
  • BACKGROUND → در 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 استفاده کنید تا ساختار پروژه شما قابل نگهداری‌تر باشد.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *