(Tutorial Android) Passing Object using Greenrobot EventBus - ARTANA

(Tutorial Android) Passing Object using Greenrobot EventBus


EventBus adalah library open source untu Android yang memungkinkan komunikasi antara komponen dengan teknik publisher/subscriber. Dengan menggunakan EventBust, kita dapat mengirim data atau objek dari kelas satu ke kelas lainnya hanya dengan beberapa baris kode saja. Selain itu juga memudahkan komunikasi antara Activity, Fragment, Thread dan Services.



Beberapa keuntungan menggunakan EventBus :
- Membuat komunikasi antar komponen menjadi sederhana
- Cepat
- Ukuran library kecil (<50k)
- Terbukti dan dipakai oleh banyak aplikasi seperti WhatsApp
- Memiliki fitur yang canggih seperti delivery thread, subcriber prioritas dan lain-lain.

Pada kesempatan kali ini, saya akan membuat tutorial sederhana dengan library EventBus. Penggunaan EventBus sangat mudah yaitu hanya perlu register sebuah kelas lalu mengirimkan objek ke tujuan. Lalu dari tujuan tinggal memanggil subcribe saja.

Langsung saja ke TKP.

Tambahkan dependencies di module-level gradle.
compile 'org.greenrobot:eventbus:3.0.0'

Disini saya menggunakan EventBus versi 3. Latest version bisa dilihat di http://greenrobot.org/eventbus/

Buat 2 buah layout diantaranya activity_main dan activity_edit.
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.wim.android_eventbus.MainActivity">

<TextView
android:id="@+id/username"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Username"/>

<TextView
android:id="@+id/realname"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Realname"
android:layout_marginTop="10dp" />

<TextView
android:id="@+id/phone"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="Phone"/>

<TextView
android:id="@+id/aboutme"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="About Me"
android:layout_marginTop="10dp" />

<Button
android:id="@+id/btnEdit"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginTop="20dp"
android:text="Edit Profile" />


</LinearLayout>

activity_edit.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="@dimen/activity_horizontal_margin">

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:orientation="vertical">

<EditText
android:id="@+id/txtUsername"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:hint="Username" />

<EditText
android:id="@+id/txtRealname"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:hint="Realname" />


<EditText
android:id="@+id/txtPhone"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:inputType="phone"
android:hint="Phone Number" />


<EditText
android:id="@+id/txtAboutMe"
android:layout_width="match_parent"
android:layout_height="100dp"
android:layout_marginTop="10dp"
android:gravity="top"
android:hint="About Me" />

<Button
android:id="@+id/btnSave"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginTop="20dp"
android:text="Save" />
</LinearLayout>

</LinearLayout>

Setelah itu buat kelas dengan nama User. Kelas User nantinya akan kita jadikan objek yang akan di kirimkan antar activity.
package com.example.wim.android_eventbus.model;

/**
* Created by wim on 5/19/16.
*/
public class User {

private String username;
private String realname;
private String phone;
private String aboutme;

public User() {
}

public String getUsername() {
return username;
}

public void setUsername(String username) {
this.username = username;
}

public String getRealname() {
return realname;
}

public void setRealname(String realname) {
this.realname = realname;
}

public String getPhone() {
return phone;
}

public void setPhone(String phone) {
this.phone = phone;
}

public String getAboutme() {
return aboutme;
}

public void setAboutme(String aboutme) {
this.aboutme = aboutme;
}
}


Untuk penggunaan EventBus hanya perlu meregistrasikan sebuah objek. Cara pemanggilannya seperti berikut :
EventBus.getDefault().register(this);
Jika tidak ingin objek berada di EventBus lagi, tinggal unregister saja dengan cara berikut :
EventBus.getDefault().unregister(this);
Untuk mengirim/post suatu event dari bagian mana saja di aplikasi Android, cukup dengan memanggil method post(). Maka otomatis objek/event akan dikirimkan ke subcriber.
EventBus.getDefault().post(user);
Nah terakhir untuk menangani setiap respon dari event/objek yang post yaitu dengan mendefinisikan method dibawah annotation @Subscribe.
@Subscribe
public void onMessageEvent(User user){
if(user != null){
username.setText("Username : "+user.getUsername());
realname.setText("Realname : "+user.getRealname());
phone.setText("Phone Number : "+user.getPhone());
aboutme.setText("About Me : "+user.getAboutme());
}
Toast.makeText(this, "Data Updated!", Toast.LENGTH_SHORT).show();
}
*Perlu di perhatikan bahwa di EventBus 3 kita bebas memberi nama method subscribe. Pada contoh di atas saya memberi nama method onMessageEvent() untuk menangani respon yang di post.

Selanjutnya buat activity dengan nama MainActivity. Disini MainActivity bertindak sebagai subsciber.
package com.example.wim.android_eventbus;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import com.example.wim.android_eventbus.model.User;

import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

private TextView username, realname, phone, aboutme;
private Button btnEdit;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

username = (TextView) findViewById(R.id.username);
realname = (TextView) findViewById(R.id.realname);
phone = (TextView) findViewById(R.id.phone);
aboutme = (TextView) findViewById(R.id.aboutme);

btnEdit = (Button) findViewById(R.id.btnEdit);

btnEdit.setOnClickListener(this);

User user = new User();
user.setUsername("wimsonevel");
user.setRealname("Wim Sonevel");
user.setPhone("088888888888");
user.setAboutme("Hello Everyone! I'm Android Developer");

username.setText("Username : "+user.getUsername());
realname.setText("Realname : "+user.getRealname());
phone.setText("Phone Number : "+user.getPhone());
aboutme.setText("About Me : "+user.getAboutme());

// Register EventBus
EventBus.getDefault().register(this);
}

@Subscribe
public void onMessageEvent(User user){
if(user != null){
username.setText("Username : "+user.getUsername());
realname.setText("Realname : "+user.getRealname());
phone.setText("Phone Number : "+user.getPhone());
aboutme.setText("About Me : "+user.getAboutme());
}

Toast.makeText(this, "Data Updated!", Toast.LENGTH_SHORT).show();
}

@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.btnEdit:
EditActivity.start(this);
break;
}
}

@Override
protected void onDestroy() {
super.onDestroy();

// Unregister EventBus
EventBus.getDefault().unregister(this);
}
}


Kemudian buat satu activity lagi dengan nama EditActivity. Event/objek akan dikirimkan lewat EditActivity.
package com.example.wim.android_eventbus;

import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

import com.example.wim.android_eventbus.model.User;

import org.greenrobot.eventbus.EventBus;

/**
* Created by wim on 5/19/16.
*/
public class EditActivity extends AppCompatActivity implements View.OnClickListener{

private Button btnSave;
private EditText username, realname, phone, about;

public static void start(Context context){
Intent intent = new Intent(context, EditActivity.class);
context.startActivity(intent);
}

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_edit);

username = (EditText) findViewById(R.id.txtUsername);
realname = (EditText) findViewById(R.id.txtRealname);
phone = (EditText) findViewById(R.id.txtPhone);
about = (EditText) findViewById(R.id.txtAboutMe);

btnSave = (Button) findViewById(R.id.btnSave);
btnSave.setOnClickListener(this);
}

@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.btnSave:
User user = new User();
user.setUsername(username.getText().toString());
user.setRealname(realname.getText().toString());
user.setPhone(phone.getText().toString());
user.setAboutme(about.getText().toString());

// Post
EventBus.getDefault().post(user);

finish();
break;
}
}

@Override
protected void onDestroy() {
super.onDestroy();
}

}


Selesai dan jalankan hasilnya :

Sebelum di edit

Edit profile

Setelah di edit

Source code lengkap dapat dilihat di https://github.com/wimsonevel/Android-EventBus

Sekian dan semoga bermanfaat.
Happy Coding :)

Berlangganan update artikel terbaru via email: