سبد خرید

آموزش کامل کار با EventBus در اندروید

EventBus برای مدیریت کردن رخداد ها و حالت های مختلف برنامه واقعا عالی هستش.

خیلی مواقع پیش میاد که میخوایم به واسطه انجام دادن کاری توی یک صفحه ای، یک اتفاق خاصی توی یک صفحه دیگه ای بیافته.

برای مثال : میخوایم به کاربر بگیم اگه شماره موبایلت رو توی پروفایلت وارد کنی یک جایزه ای رو بهت میدیم.

کاربر وارد صفحه پروفایلش میشه و شماره‌ش رو وارد میکنه. بعد که برمیگرده صفحه اصلی یک رخدادی فراخوانی میشه و فرضا یک کاپ به نشانه جایزه منفجر میشه و بهش اون جایزه رو میدیم.

حتی میتونیم با این کتابخونه اطلاعاتی رو باهاش پاس بدیم و توی صفحه دیگه ای دریافت کنیم.

یا یک مثال دیگه ای بزنم : مثلا میخوایم کاربر تغییراتی که توی صفحه سبد خرید انجام میده رو به صورت لحظه ای توی صفحات دیگه هم ببینه.

تمامی این موارد و حتی خیلی بیشتر و پیچیده تر از این موارد رو خیلی راحت میتونی با EventBus پیاده سازی کنی.

در ادامه به صورت متنی هم میتونی آموزش رو بخونی و هم به کدهای استفاده شده توی ویدیو دسترسی داشته باشی.

افزودن EventBus به پروژه

برای استفاده کردن از این کتابخونه باید کد زیر رو توی فایل project/build.gradle قرار بدیم.

implementation 'org.greenrobot:eventbus:3.2.0'

بعد از اینکار پروژه رو sync کنید.

نحوه کارکردن کلی کتابخونه

این کتابخونه برای کار کردن نیاز به یک کلاس داره که بتونه ارتباط بین صفحات مختلف رو با اون کلاس برقرار کنه.

بعد از اون بین صفحاتی که مد نظرت هست باید از اون کلاس استفاده کنی.

کلاس ارتباطی بین صفحات

کار این کلاس اینه که ارتباط بین صفحات رو برقرار کنه.

برای اینکار من از کد زیر استفاده کردم و حتی شماره موبایل رو هم میخوام به صفحه دیگه پاس بدم.

نکته
هیچ اجباری نیستش که حتما اطلاعات رو بین صفحات پاس بدید.
حتی میتونید هیچ چیزی رو بین صفحات انتقال ندید.
class EventShowTrophy(val phone: String)

اینجا فقط یک کلاس معمولی درست کردم و شماره موبایل رو هم به عنوان ورودی بهش دادم.

ایجاد ارتباط بین صفحات

توی این مرحله من به 2 تا صفحه نیاز دارم.

یکی صفحه پروفایل برای وارد کردن شماره موبایل.

یکی هم صفحه اصلی برای نشون جایزه (یا هر صفحه دیگه ای).

من میخوام به واسطه انجام دادن کاری توی صفحه پروفایل یک اتفاق خاصی توی صفحه اصلی من رخ بده.

کدهای صفحه پروفایل

این کد رو توی صفحه پروفایل خودم قرار میدم.

EventBus.getDefault().postSticky(EventShowTrophy(phone))

درواقع هرموقع این کد اجرا بشه، به واسطه اون توی صفحه دیگه ای که ازش استفاده شده فراخوانی میشه.

همونطور که توی ویدیو دیدی من روی دکمه که میزنم شماره رو میگیرم و با کد بالا ارسال میکنم.

کدنهایی استفاده شده در پروفایل
class ProfileActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_profile)

        eventBusPhoneSubmit.setOnClickListener {
            val phone = eventBusPhoneEdt.text.toString()
            EventBus.getDefault().postSticky(EventShowTrophy(phone))
            finish()
        }
    }
}

کدهای صفحه اصلی

این صفحه هم وظیفه دریافت اطلاعات و نمایش رخداد رو برعهده داره.

به محض اینکه کاربر از صفحه قبلی خارج بشه کدهایی که توی این صفحه و توی بخش onPhoneEvent نوشتم، کاملا خودکار اجرا میشن.

برای اینکه این صفحه بتونه EventBus رو فعال کنه باید کدهای زیر رو به اون اضافه کنی.

override fun onStart() {
    super.onStart()
    EventBus.getDefault().register(this)
}

override fun onStop() {
    super.onStop()
    EventBus.getDefault().unregister(this)
}

بعد از اینکار باید یک متد بنویسی و با کمک اون متد رخدادهای دریافتی رو مدیریت کنی.

برای اینکه EventBus متوجه بشه که این متد برای استفاده کردن از رخدادها هستش، باید از حاشیه نویسی Subscribe استفاده کنی.

توی این حاشیه نویسی باید عملکرد Thread یا نخ رو هم مشخص کنی که این رخداد روی کدوم نخ باید اجرا بشه.

چون تغییرات مربوط به رابط کاربری میشه پس باید از نخ MAIN استفاده کنیم.

درست مثل کد زیر

@Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
fun onPhoneEvent(event: EventShowTrophy) {
    eventBusOpenProfile.visibility = View.GONE
    eventBusPhoneNumber.visibility = View.VISIBLE
    eventBusAnimationView.visibility = View.VISIBLE

    eventBusPhoneNumber.text = event.phone
    eventBusAnimationView.playAnimation()
}

با این کد اگه رخداد توی صفحه پروفایل صدا زده بشه بلافاصله عملیاتی که مد نظرمون هست توی این متد فراخوانی میشه.

کدنهایی استفاده شده در صفحه اصلی
class EventBusActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_event_bus)

        eventBusOpenProfile.setOnClickListener {
            startActivity(Intent(this, ProfileActivity::class.java))
        }
    }

    @Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
    fun onPhoneEvent(event: EventShowTrophy) {
        eventBusOpenProfile.visibility = View.GONE
        eventBusPhoneNumber.visibility = View.VISIBLE
        eventBusAnimationView.visibility = View.VISIBLE

        eventBusPhoneNumber.text = event.phone
        eventBusAnimationView.playAnimation()
    }

    override fun onStart() {
        super.onStart()
        EventBus.getDefault().register(this)
    }

    override fun onStop() {
        super.onStop()
        EventBus.getDefault().unregister(this)
    }
}

 

این کتابخونه کمک های خیلی زیادی میتونه بهمون بکنه.

حتما اونو کامل یاد بگیرید و توی پروژه هاتون ازش استفاده کنید.

دیدگاه‌ها ۰