EventBus is the number 1 event library for android and java. EventBus uses the publisher and subscriber pattern for loose coupling which means the possibility of errors will be less. EventBus simplifies the communication between different components for example communications between different levels of activities or even services. You need very less or no setup to use EventBus in your existing project.
EventBus provides a convenient annotation-based API which makes it fast and the performance is increased. EventBus is used by many popular apps, apps which has 1 billion-plus download which shows how EventBus popular.
In this tutorial, we will see how we can get started using EventBus in an android project. Before jumping in the code let's see what we will be going to make. To better understanding EventBus we will make an app that allows us to add items to the cart and show the total count of the items. See below how our app will work.
Let's get started.
First, we need to add EventBus Dependency in the project. Open your build.gradle and add the dependency.
implementation 'org.greenrobot:eventbus:3.2.0'
Hit the sync button and move to the next step.
The next step is to make a Java object class to pass in the EevntBus Subscribe method and to be used later.
For our example app, we will make a class with the name of CartEvent.java with a string field for cart items.
See the below code for better understanding.
public class CartEvent {
public String cartItem;
public CartEvent(String cartItem) {
this.cartItem = cartItem;
}
}
Move to the next step.
See also: Android Libraries for Beginner Developers
In the first activity, we have a textview to show the total count of the cart item.
And a button to open second activity to add items in the cart.
See the below code to understand.
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Cart Item: 0"
android:id="@+id/cartTextView"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:layout_marginTop="50sp"
android:textAppearance="@style/TextAppearance.AppCompat.Title"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Add Items"
android:id="@+id/button"
android:onClick="open"
app:layout_constraintTop_toBottomOf="@id/cartTextView"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
Now make the second activity to show the items list and add a method for the button click.
We made simple cart items. We add 3 items but in the real world application, you should use recyclerview or any other view to make a list of items.
See Also: Bottom Navigation in Android
Here is the second activity XML code.
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="15sp"
tools:context=".MainActivity2">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/item1"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:text="Item 1"
android:layout_marginTop="25sp"
android:textAppearance="@style/TextAppearance.AppCompat.Title"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/addItem1"
android:text="Add to cart"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="@id/item1"
app:layout_constraintBottom_toBottomOf="@id/item1"
android:onClick="addItemToCart"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/item2"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toBottomOf="@id/item1"
android:text="Item 2"
android:layout_marginTop="25sp"
android:textAppearance="@style/TextAppearance.AppCompat.Title"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/addItem2"
android:text="Add to cart"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="@id/item2"
app:layout_constraintBottom_toBottomOf="@id/item2"
android:onClick="addItemToCart"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/item3"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toBottomOf="@id/item2"
android:text="Item 3"
android:layout_marginTop="25sp"
android:textAppearance="@style/TextAppearance.AppCompat.Title"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/addItem3"
android:text="Add to cart"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="@id/item3"
app:layout_constraintBottom_toBottomOf="@id/item3"
android:onClick="addItemToCart"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
In the above code, we have added the onClick attribute and pass the addItemToCart method name.
And made the appropriate method in the second activity java.
public void addItemToCart(View view) {
}
Now implement EventBus in the project.
Let's make the subscriber and in the subscriber method, we will add items to the list.
See below to understand.
We will show cart count in the first activity so we need to update cart count in the subscriber method. Open your java file and create a method onCartItemAdd and in the parameter, we will get our CartEvent object.
We will add this object to the list and then show the list size in the cart count.
To tell the EventBus to trigger this method we need to add the @Subscribe annotation to the method.
List<CartEvent> cartEventList = new ArrayList<>();
TextView cartTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
cartTextView = findViewById(R.id.cartTextView);
}
@Subscribe
public void onCartItemAdd(CartEvent cartEvent){
cartEventList.add(cartEvent);
String cartTotalItems = "Cart Items: "+cartEventList.size();
cartTextView.setText(cartTotalItems);
Toast.makeText(this, "Item added to cart.", Toast.LENGTH_SHORT).show();
}
We should unregister and re-register the EventBus in the onStart and onDestroy method on the activity.
@Override
protected void onStart() {
super.onStart();
if (!EventBus.getDefault().isRegistered(this))
EventBus.getDefault().register(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
Now we will call this method on the add item click of second activity.
In the second activity, we already created a button onClick method. In that method, we will call the EventBus post method and pass our CartEvent object.
public void addItemToCart(View view) {
EventBus.getDefault().post(new CartEvent("new Cart Item"));
}
That's it. Now run your app and add an item to the cart and back to the first activity then you can see your updated cart item count.
This is just a simple example to get started in EventBus, you can use EventBus wherever it fits in your requirement.
So guys this is the end of this article, I hope this article helped you somewhere.
Don't forget to support us and share this article with your friends or batchmates.
Thank you and have a nice day.
Previously published at https://www.akshayrana.in/2020/09/event-bus-in-android-with-example.html