Event Programming در اندروید با GreenRobot
در مقالات قبل, مبحث Event Programming و شیوه پیاده سازی آن در جاوا را مورد بررسی قرار دادیم. در این مقاله قصد داریم تا Event Programming را با استفاده از GreenRobot Event Bus در اندروید پیاده سازی کنیم.
یکی از موارد بسیار پرکاربرد در مبجث Event Programming در اندروید, در هنگام ایجاد Click Listener برای اعضای یک Recyclerview است. معمولا برنامه نویسان, از یک Interface استفاده میکنند. اما در این مقاله با استفاده از Event Bus این عمل را تسهیل میکنیم.
ابتدا نیاز است تا Gradle Dependency آن را به پروژه اضافه کنیم:
compile 'org.greenrobot:eventbus:3.1.1'
سپس یک RecyclerView میسازیم و مدل دادهای آن را به این صورت در نظر میگیریم:
public class Model { private String username; private String password; private String mail; private boolean def; // default }
در اینجا قصد نداریم تا تمام مراحل پیاده سازی RecyclerView را مورد بررسی قرار دهیم. برای پیاده سازی کلاس Adapter برای Recyclerview میتوانید به این مقاله مراجعه کنید. بنابراین کلاس Adapter آن را به این صورت مینوییسیم:
class UserListAdapter extends RecyclerView.Adapter { private Context context; private List<Model> models; public UserListAdapter(Context context, List<Model> models) {...} @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {...} @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {...} public List<Model> getModels() {...} @Override public int getItemCount() {...} class ModelView extends RecyclerView.ViewHolder { View view; public ModelView(View itemView) {...} public void bind(Model model) { ((TextView) view.findViewById(R.id.category)).setText(model.getCategory()); ((TextView) view.findViewById(R.id.mail)).setText(model.getMail()); ((TextView) view.findViewById(R.id.username)).setText(model.getUsername()); view.findViewById(R.id.delete).setEnabled(!model.isDef()); } } }
و بعد از اضافه کردن مدل ها به لیست چنین نتیجه ای خواهیم داشت:
حال فرض کنید میخواهیم با کلیک بر روی هر یک از اجزا ظاهری, یک رویداد دریافت شود. برای مثال با کلیک بر روی مشخصات, مقدار آنها نمایش داده شود. برای این منظور نیاز است تا یک EventModel ایجاد کنیم:
public class MessageEventModel { private String message; }
اکنون باید قابلیت مدیریت EventBus ها را به کلاس Activity اضافه کنیم:
@Override protected void onStart() { /// GreenRobot EvenBus Register super.onStart(); EventBus.getDefault().register(this); } @Override protected void onStop() { super.onStop(); /// GreenRobot EvenBus Unregister EventBus.getDefault().unregister(this); } @Subscribe public void showMessage(MessageEventModel messageEventModel) { /// GreenRobot EventBus Show Message Toast.makeText(this, messageEventModel.getMessage(), Toast.LENGTH_LONG).show(); }
در متد onStart کلاس EventBus را به Activity متصل و در متد onStop آن را جدا میکنیم. مانند مقاله قبل, یک متد برای مدیریت رویدادی که رخ میدهد, مینویسیم. در این متد پیام که متن بخش کلیک شده است, نمایش داده میشود. برای این منظور باید متد post موجود در کلاس EventBus را برای هریک از اجزا ظاهری بنویسیم و مشخص کنیم که پس از کلیک بر روی آن, چه مقداری ارسال شود:
final TextView category = view.findViewById(R.id.category); category.setText(model.getCategory()); category.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { EventBus.getDefault().post(new MessageEventModel(category.getText().toString())); } }); final TextView mail = view.findViewById(R.id.mail); mail.setText(model.getMail()); mail.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { EventBus.getDefault().post(new MessageEventModel(mail.getText().toString())); } }); final TextView username = view.findViewById(R.id.username); username.setText(model.getUsername()); username.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { EventBus.getDefault().post(new MessageEventModel(username.getText().toString())); } });
اکنون میخواهیم عمل حذف را نیز در یک متد مجزا در Activity مدیریت کنیم. برای این منظور نیاز است تا یک EventModel برای این رویداد تعریف کنیم:
public class DeleteEventModel { private boolean valid; private String message; }
سپس برای ImageView که در اینجا برای حذف اجزا از لیست در نظر گرفته شده است, چنین مینویسیم:
ImageView delete = view.findViewById(R.id.delete); delete.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (model.isDef()) { EventBus.getDefault().post(new DeleteEventModel(false, "Cant Remove Default Item")); } else { EventBus.getDefault().post(new DeleteEventModel(true,"Are you Sure ?")); } } });
اکنون نیاز است تا برای مدیریت این رویداد نیز یک متد با استفاده از Subscribe@ تعریف کنیم:
@Subscribe public void delete(DeleteEventModel deleteEventModel) { /// GreenRobot EventBus Delete Item if (deleteEventModel.isValid()) { // show Confirm dialog . getText (deleteEventModel.getMessage() } else { Toast.makeText(this, deleteEventModel.getMessage(), Toast.LENGTH_LONG).show(); } }
در این مقاله سعی بر این شد تا با استفاده از EventBus, ایجاد و مدیریت رویداد ها را در اندروید مورد بررسی قرار دهیم. استفاده از EventBus ها باعث میشود تا خوانایی پروژه افزایش یابد و در بسیاری از مواقع, فارغ از نیاز به پیاده سازی Interface ها, بخش های گوناگون برنامه را مدیریت کنید. همچنین استفاده از این Library باعث میشود تا سرعت کدنویسی نیز افزایش یابد.
با ما همراه باشید.
مطالب زیر را حتما مطالعه کنید
آموزش Gradle – اهمیت Project Automation
درک مفهوم کدنویسی تمیز در اندروید
5 هک ساده برای کاهش سایز فایل APK
آشنایی با RecyclerView در اندروید
Open/Closed Principle در قوانین Solid
توابع در زبان برنامه نویسی Kotlin
5 Comments
Join the discussion and tell us your opinion.
دیدگاهتان را بنویسید لغو پاسخ
برای نوشتن دیدگاه باید وارد بشوید.
ممنون
مشکلم حل شد
Register را تو ساب فرگمنتم انجام دادم مشکلم حل شد /.
سپاس
سلام. ممنون از همراهیتون. مرسی که جواب مشکلتون به اشتراک گذاشتین
سلام جناب رجبی
من از استفاده از این کتابخانه در گوشی api14 مشکل دارم
و وقتی register انجام میدم تو Activity برنامه کرش میکنه
و خیلی هم سرچ کردم به انگلیسی ولی جواب واضحی پیدا نکردم
ممنون میشم راهنمایی کنید واقعا گیرم
درود
خسته نباشید
خیلی عالی بود
فقط خواستم بدونم توی سرعت برنامه و پردازش تاثیر نمیذاره؟
کُند نمیکنه اپ را؟
سلام دوست عزیز. ممنون از همراهیتون. خیر تا بحال که به چنین مشکلی برخورد نکردیم. البته این کتابخونه ها همینجوری در حال بروزرسانی هستند و طبیعتا یکی از عواملی که توی بروزرسانی ها مد نظر قرار میگیره بهتر شدن سرعت برنامست. اما باعث ضعف در برنامه بشه تا بحال دیده نشده.