کتابخانه EventBus در اندروید
EventBus یک کتابخانه open-source برای اندروید و جاوا میباشد که بر پایه ی publisher/subscriber است .این کتابخانه یک ارتباط مرکزی ایجاد میکند که به وسیله آن میتوان ارتباط بین Activity ها و Fragment ها را خیلی ساده تر و راحتر حتی بدون ایجاد تداخلی برقرار کرد و با نوشتن چند خط کد ساده وابستگی را از بین میبرد و سرعت برنامه را نیز افزایش می دهد.
هدف استفاده از EventBus
به طور مثال اگر بخواهیم یک داده ایی از یک Activity به چند Activity و یا چند Fragment ارسال کنیم از این کتابخانه استفاده میکنیم یعنی یک داده توسط Publisher به یک اکتیویتی Post می شود و داده توسط Subscriber در یک یا چند Activity و یا Fragment دریافت و تنظیم می شود و مثل این می ماند که داده ای اصلا جابه جا نشده است.
مزایای استفاده از کتابخانه EventBus
- ارتباط بین component را ساده میکند.
- فرستنده و گیرنده را از هم جدا می کند.
- با Activity ، Fragmentو background threads عملکرد عالی دارد.
- از وابستگی پیچیده و مستعد خطا و مشکلات مربوط life cycle جلوگیری می کند.
- سریع است به طور خاص برای عملکرد بالا بهینه شده است.
- کتابخانه ی خیلی کم حجمی است(~60k jar)
- تا کنون در حدود 1میلیون نصب فعال داشته است.
- ویژگی های پیشرفته ای مانند delivery threads وsubscriber priorities و… را دارا می باشد.
متد های کاربردی کتابخانه EventBus
خب در ابتدا می خواهیم متدهای این کتابخانه رو بهتون معرفی کنم تا بیشتر باهاش آشنا شیم:
Register :به منظور ثبت یک رویداد استفاده قرار می گیرد
EventBus.getDefault().register(this);
un-register : به منظور برداشتن یک رویداد ثبت شده از EventBus استفاده می شود.
1EventBus.getDefault().unregister(this);
Post : برای ارسال داده یا متد مورد نظر در هر جای برنامه استفاده میشود و Activity/Frgmentهای که متد subscriber داشته باشن میتوانند اون داده رو دریافت کنند
EventBus.getDefault().post(eventName);
@subscriber : به منظور دریافت یک رویداد استفاده میشود
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(Events.EventName event) {/* Do something */};
توضیحات تکمیلی کتابخانه EventBus
خب همونطوری که گفتم یک قسمت publisher (قسمتی که از متد post باید استفاده کرد و داده را ارسال کرد) و یک قسمت subscriber (قسمتی که داده post شده رو میشه دریافت کرد) داریم.
هر وقت با متد post در یک Activity/Fragment داده ارسال شود تمای Activity/Fragmentهایی که متد subscriber دارند به آن داده ارسال شده دسترسی دارند (اگه بخوام راحت تر بگم یک داده یا متد رو همه جای پروژتون میتونید بهش دسترسی داشته باشید فقط کافیه ابتدا اونو post کنید و سپس تو Activity/Fragmentهای مقصد با متد subscriber بگیریمش J)
نکته مهم : در قسمت گیرنده(Subscriber) حتما باید متد های register و un-register را بنویسیم چون متد subscriber نیاز به این دو متد برای انجام کار دارد .اگه این کارو نکنید هیچ وقت به داده های ارسالی دست پیدا نمیکنید.
پیاده سازی کتابخانه EventBus در اندروید استودیو
باید همانند دیگر کتابخانه ها dependency آن را به فایل gradle پروژه اضافه کنیم.
- به فایل gradle(Module:app) و در قسمت dependencies خط زیر را اضافه میکنیم
implementation 'org.greenrobot:eventbus:3.2.0'
2.یک کلاس برای Event خود می نویسیم
public static class MessageEvent { /* Additional fields if needed */ }
3.با استفاده از متد post ،Event خود را ارسال میکنیم
EventBus.getDefault().post(new MessageEvent());
4.با استفاده از متد subscriber ،Event ارسالی از متد post را در گیرنده می گیریم
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(MessageEvent event) {/* Do something */};
براساس life cycle قسمتی که هستیم منظور Activity/Fragment گیرنده است در قسمت onStart آن باید متد register و در قسمت onStop باید متد un-register را به شکل زیر بنویسیم.
@Override
public void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
@Override
public void onStop() {
EventBus.getDefault().unregister(this);
super.onStop();
}
و تمام ،خیلی ساده بود مگه نه !
خب حالا که فهمیدیم باید چیکار بکنیم بریم ی مثال ساده باهم بزنیم
قراره که با کلیک بر روی یک Button در Activity یک مقدارString (رشته) و یک مقدار int به یک Fragment بفرستیم و اون داده مورد نطرمونو تو یک Toast نمایشش بدیم
خب اولین کار ساخت کلاس است برای ساده شدن کار من یک کلاس Encapsolation می سازم چون می خوام تو این مدلم داده پاس بدم
public class MessageEvent {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
خب به سراغ Activity مبدا برای post کردن مقدار داده خود می رویم
برای دسترسی به متدهای داخل کلاس از آن object می سازیم وobject خود را مقدار دهی و سپس مقدار آن را post می کنیم.دقت کنید کد زیر را در قسمت onclick دکمه مورد دلخواه خود در Activity می نویسیم
MessageEvent event=new MessageEvent();
event.setName("SharYar");
event.setAge(25);
EventBus.getDefault().post(event);
حال به قسمت گیرنده می رویم مقصد ما به طور دلخواه یک Fragment است.
متد subscriber را برای گرفتن مقادیرمان می نویسیم
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(MessageEvent event) {
Toast.makeText(getActivity(), event.getName()+" is "+event.getAge()+" years old.", Toast.LENGTH_SHORT).show();
}
یادمان نرود در سمت گیرنده حتما باید متد subscriber را register و un-register کنیم پس
@Override
public void onStart() {
EventBus.getDefault().register(this);
super.onStart();
}
@Override
public void onStop() {
EventBus.getDefault().register(this);
super.onStop();
}
خب کار تمام است پروژه خود را Run می کنیم میبینم که با زدن دکمه یک Toast حاوی
SharYar is 25 years old.
نمایش داده می شود.
دیدگاهتان را بنویسید