Event bus

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

مثلا فکر کنید زمانی که توی اکتیویتی دکمه رفرش رو کاربر زد قصد داریم که به فرگمنت های داخلش خبر بدیم که خودشون رو رفرش کنن.

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

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

(البته روش دیگری هم هست که استفاده از Broadcast manager خود اندروید هست اما به قدری کار با EventBus ساده و لذت بخش هست که من خودم فکر می کنم قبل از این لایبرری چطور کد می زدم 😀 )

 

نحوه استفاده از این لایبرری خیلی ساده هست

 

ابتدا اون رو به پروژتون اضافه کنید(خط زیر رو در Dependency های فایل gradle اضافه کنید):

 

compile 'org.greenrobot:eventbus:3.0.0'

 

حالا میتونید ازش استفاده کنید.

 

برای ارسال یک Event در برنامه از کد زیر استفاده کنید:

EventBus.getDefault().post(new MessageEvent());

با این کد، در برنامه یک Event ارسال می شود ، Event مانند یک خبر هست که در سطح برنامه پخش می شود و هرکسی که تمایل داشته باشه میتونه به اون خبر گوش بده ، در اینجا ما خبر MessageEvent رو در سطح برنامه منتشر کردیم ، به جای MessageEvent میتونید از هر آبجکت دیگری استفاده کنید ، مثلا میتونید یک آبجکت به اسم MyEvent بسازید که یک متن هم داخلش بگیره و اون رو ارسال کنید:

EventBus.getDefault().post(new MyEvent("Test"));

خوب حالا برای گوش دادن به این خبر، از کد زیر استفاده می کنیم:

@Subscribe

public void onMessageEvent(MyEvent event) {/* Do something */};

یک متد با هر اسمی که می خواهیم (در اینجا onMessageEvent) می سازیم که ورودیش همون آبجکتی هست که ساخته بودیم و اون رو در بالا اطلاع رسانی کردیم برای اینکه در اینجا اون رو بگیریم به عنوان ورودی تعریف می کنیم و نکته مهم افزودن @Subscribe به بالای متد هست که باعث میشه لایبرری این متد رو به عنوان یک متد شنونده برای آبجکت ما در نظر بگیره.

همه چیز تا اینجا خوبه ، فقط یک چیز مونده.

در صفحاتی که قصد داریم به عنوان شنونده به یک Event گوش بدهیم به جز اینکه باید یک متد با @Subscribe بسازیم و ورودیش رو از همون جنس آبجکت مورد نظر در نظر بگیریم ، باید به لایبرری بفهمونیم که این کلاس (اکتیویتی ، فرگمنت یا سرویس) ما ، یک کلاس شنونده هست ، و زمانی که اکتیویتی ساخته می شه شروع کن به اطلاع رسانی ها گوش بده و بعد از اینکه اکتیویتی بسته شد دیگه به Event ها گوش نده.

برای این کار توی onStart و onStop اکتیویتی یا فرگمنت یا سرویس و یا هر کلاس مورد نظر خودمون به شکل زیر EventBus رو رجیستر و ان رجیستر می کنیم.

@Override
public void onStart() {
    super.onStart();
    EventBus.getDefault().register(this);
}

@Override
public void onStop() {
    super.onStop();
    EventBus.getDefault().unregister(this);
}

امیدوارم این آموزش مفید بوده باشه

https://github.com/greenrobot/EventBus

برچسب ها:
پست قبلی
پست بعدی

درباره ایلیا عابدینی

برنامه نویس اندروید و کارشناس مهندسی پزشکی، نفر سوم مسابقه برنامه نویسی اندروید http://www.schallenge.ir ، از سال 92 برنامه نویسی اندروید رو شروع کردم و در حال حاضر در شرکت عصر دانش در حال توسعه اپلیکیشن تجارت پی می باشدم ، این وبلاگ رو ساختم تا تجربیات روزانه و مفید خودم رو داخل اون بزارم. رزومه : iact.ir/cv

دیدگاهتان را ثبت کنید

آدرس ایمیل شما منتشر نمی شود.علامت دارها لازمند. *

*

رفتن به بالا