ارسال اطلاعات بین صفحات مختلف با EventBus
14 اسفند 1399 1399-12-14 17:40ارسال اطلاعات بین صفحات مختلف با EventBus
ارسال اطلاعات بین صفحات مختلف با EventBus
EventBus بهت کمک میکنه که بتونی اطلاعات مختلف رو بین صفحات گوناگون انتقال بدی.
فرض کن که 2 تا صفحه داریم.
مثلا : Activity Main – Activity Cart
Activity Main : صفحهای هستش که لیست محصولات رو بهمون نشون میده.
Activity Cart : صفحه سبد خرید هستش، یعنی هر محصولی که توی Activity Main به سبد خرید اضافه میکنیم، توی صفحه Activity Cart قیمت نهایی که باید پرداخت کنیم رو نشون میده.
حالا ما میخوایم وقتی توی Activity Main محصولی رو به سبد خرید اضافه کردیم، قیمت پرداخت نهایی توی صفحه Activity Cart تغییر کنه، بدون اینکه توی Activity Cart بخوایم دوباره اطلاعات رو از سرور بگیریم.
یا یه مثال دیگه، مثلا توی صفحه ویرایش حساب کاربری رفتیم و عکس خودمون رو عوض کردیم، حالا میخوایم بلافاصله توی صفحه پروفایل هم این تغییر رو ببینیم!
اینجاست که EventBus کاملا به کمک ما میاد.
خب حالا که متوجه شدی EventBus چه کمکی به ما میکنه، بریم که پیاده سازی کنیم.
افزودن کتابخونه :
کد زیر رو به فایل app/build.gradle باید اضافه کنی.
implementation 'org.greenrobot:eventbus:3.2.0'
بعد از اینکه کد بالا رو اضافه کردی پروژه رو باید sync کنی.
EventBus برای اینکه این ارتباط رو برقرار کنه نیاز به یه کلاس داره.
این کلاس رو باید خودت درستش کنی.
درواقعا کار این کلاس اینه که پل ارتباطی بین صفحات رو برقرار کنه و اون اطلاعاتی که میخوای رو انتقال بده.
توی مثال بالا گفتم که میخوام قیمت رو از Activity Main به Activity Cart انتقال بدم.
پس باید یه کلاسی درست کنم که مقدار قیمت رو انتقال بده.
من قصد دارم قیمت رو در قالب Int انتقال بدم.
ساخت کلاس event یا رخداد :
class EventSendPriceToCart{ data class OnSendPrice(val price: Int) }
خب همونطور که میبینی من یه کلاسی رو درست کردم و قیمت رو در قالب OnSendPrice قراره ارسال کنم.
الان فقط باید از این کلاس بالایی استفاده کنیم.
من میخوام اگه توی Activity Main یه محصولی رو به سبد خرید اضافه کردم به Activity Cart خبر بده.
پس کد زیر رو توی Activity Main جایی که به واسطه اون عملیات قیمت آپدیت میشه رو قرار میدم.
کد مربوط به Activity Main :
EventBus.getDefault().post(EventSendPriceToCart.OnSendPrice(price))
با کد بالا شما درواقع قیمت رو در سطح کل پروژه ارسال میکنید.
باید جایی که قرار هست از این قیمت استفاده کنید یک منبعی قرار بدین که بتونه این اطلاعات رو دریافت کنه.
درست مثل فرسنده و گیرنده رادیوای.
فرستندههای رادیوایِ خیلی زیادی وجود دارن، ولی شما فقط اونهایی رو دریافت میکنید که گیرندهتون براش پیاده سازی شده.
پس توی EventBus هم میشه کل اطلاعات رو از جاهای مختلف فرستاد، بدون اینکه مشکلی برای هم ایجاد کنند.
فقط کافیه گیرنده مورد نظر رو اعمال کنید.
خب رسیدیم به مرحله آخر که باید درواقع گیرندهها رو قرار بدیم.
برای اینکار وارد اون صفحهای بشید که قراره این اطلاعات رو دریافت کنه. مثلا Activity Cart
اول از همه باید این کدها رو به کلاس اضافه کنی :
override fun onStart() { super.onStart() EventBus.getDefault().register(this) } override fun onStop() { super.onStop() EventBus.getDefault().unregister(this) }
خب دیگه تقریبا کار تمومه.
حال باید این اطلاعات رو دریافت و ازشون استفاده کرد.
برای اینکار باید کدهای زیر رو به کلاس اضافه کنی :
@Subscribe(threadMode = ThreadMode.MAIN) fun onReceivePrice(event: EventSendPriceToCart.OnSendPrice) { textView.text = event.price }
با کد بالا خیلی راحت میتونی مقدار Price رو که از کلاس دیگه فرستادی رو دریافت کنی و ازش استفاده کنی.
نکته 1 : یادت باشه که حتما از Annotation زیر استفاده کنی، چون کمکت میکنه که تغییرات رو روی UI Thread انجام بدی.
@Subscribe(threadMode = ThreadMode.MAIN)
نکته 2 : این عملیات صرفا مربوط به Activityها نیستش، میتونید توی Fragment، Adapter هم استفاده کنی.
حتی میشه ارتباط بین این کلاسهای مختلف رو برقرار کرد، مثلا ارتباط بین Adapter با Activity.
مثلا اگه توی Adapter یه RecyclerView اگه روی یه دکمهای کلیک شد توی Activity یا Fragment فلان کار رو انجام بده.