Showing posts with label event bus. Show all posts
Showing posts with label event bus. Show all posts

Wednesday, June 15, 2016

Event bus menggunakan RxJava

Pada blog sebelumnya saya telah membahas tuntas tentang Event Bus dan imeplementasi menggunakan otto. Dan sayang sekali Otto sudah deprecated dan tim otto merekomendasikan menggunakan RxJava dan RxAndroid yang mempunyai kemampuan lebih baik untuk mengontrol thread.

Tambah di Gradle:

compile 'io.reactivex:rxandroid:1.2.0'
compile 'io.reactivex:rxjava:1.1.5'

Buat class RxBusEventHelper
import rx.Observable;
import rx.subjects.PublishSubject;
public class RxBusEventHelper {
    private PublishSubject<Object> subject = PublishSubject.create();
    public RxBusEventHelper(){
    }
    /**
     * Pass any event down to event listeners.
     */
    public void send(Object object) {
        subject.onNext(object);
    }
    /**
     * Subscribe to this Observable. On event, do something
     * e.g. replace a fragment
     */
    public Observable<Object> getEvents() {
        return subject;
    }
}

Contoh publish event:
mRxBusEventHelper.send(new YourEventName());

Contoh subscribe event
Action1<object> subscribeEvent = new Action1<object>() {
    @Override
    public void call(Object o) {
        if(o instanceof YourEventName)
            doSomething();
    }
}


Sekian blog dari saya semoga bermanfaat.

Tuesday, March 15, 2016

Implementasi Event Bus menggunakan Otto

Pada blog sebelum-nya saya telah menjelaskan apa keuntungan menggunakan Event Bus. Pada blog kali ini saya akan mencoba menjelaskan impelentasinya menggunakan library Otto.

1. Pertama
compile 'com.squareup:otto:1.3.8'

2. Kedua create instance Bus di Application class
import android.app.Application;
import android.util.Log;
import com.squareup.otto.Bus;
import com.squareup.otto.ThreadEnforcer;

/**
 * Created by nostra on 3/15/16.
 */
public class OurApp extends Application{
    private static Bus mEventBus;
    public static Bus getEventBus() {
        return mEventBus;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        mEventBus = new Bus(ThreadEnforcer.ANY);
     

    }
}

3. Create pojo class untuk mendefinisikan Event. Pada kasus ini saya membuat event ketika user yg login sudah invalid.
/**
 * Created by nostra on 3/15/16.
 */
public class UnauthorizedEvent {
    public int status;

    public UnauthorizedEvent(int status) {
        this.status = status;
    }
}

4. Publisher melakukan post event, berikut potongan logic-nya:
if(status==401){
    OurApp.getEventBus().post(new UnauthorizedEvent(status));
    return;
}

5. Pada Activity Anda tambahkan register bus, seperti gambar dibawah:
    @Override
    protected void onStart() {
        super.onStart();
        OurApp.getEventBus().register(this);
    }

    @Override
    protected void onStop() {
        super.onStop();
        OurApp.getEventBus().unregister(this);
    }

6. Langkah terakhir Activity melakukan subscribe, berikut contohnya:
    @Subscribe
    public void unauthorizedEvent(UnauthorizedEvent event){
        if(event.status==401){
            Intent i = new Intent(this, Login.class);
            startActivity(i);
            finish();
        }
        Log.i(TAG, "Event status :" + event.status);

    }

Yay, Mudah bukan. Untuk next level penggunaan Event bus kalian bisa baca artikel dibawah:
https://labs.ribot.co.uk/android-application-architecture-8b6e34acda65#.mimpcgc5v

Sekian dan terima kasih

Event bus Android

Pada kali ini saya akan membahas tentang Event Bus di Android. Konsep Event Bus sekarang ini sangat populer  mungkin aplikasi Android yg kalian install menggunakan konsep ini.

Sebelum kita mulai, mari kita lihat bagaimana component android (activity, fragment, service etc) saling berkomunikasi. Berikut gambarnya:



Padahal gambar diatas bisa dilihat beberapa komponen Android saling berkomunikasi. Coba kalian bayangkan apabila aplikasi kalian lebih besar dari contoh diatas. Wow pasti akan sulit dimaintain dan tidak agile, berikut beberapa kekurangan dari gambar diatas:
  • Tight coupling antara component
  • Mengubah UI menjadi mimpi buruk!!!
  • Boiler plate koding:
    • Butuh mendefinisikan Interface
    • Callback callback dan callback untuk setiap async task dan komunikasi antar component!
    • Listener management
  • Menambahkan 1-5 line code untuk mencegah aplikasi crash jika state component sedang tidak aktif ketika melakukan callback, misal : ingin menampilkan pesan sukses dilayar (TextView) ketika AysncTask sudah selesai di eksekusi tetapi pada saat itu state Fragment tidak di attached ke dalam Activity jika hal ini tidak di handle dengan baik maka aplikasi akan menjadi crash. Bisa dibayangkan jika kalian mempunya 3 AsynTask dalam 1 komponen. 
Event Bus akan menyelamatkan Anda dari permasalahan diatas:


Pada data diatas terlihat setiap komunikasi ter-centralize dan setiap komponen di atas tidak saling berkomunikasi secara langsung. Ada 4 langkah untuk melakukan Event Bus:
  1. Definisikan Event
  2. Register Subscriber
  3. Post Event (Publisher)
  4. Receive Event
Berikut gambar detil dari 4 langkah diatas:
Post Event bisa dilakukan dari mana saja (activity, service dll) dan Event akan diterima kepada komponen yang men-subscribe event tersebut. Hmm cukup mudah bukan.

Untuk menggunakan konsep ini cukup mudah banyak contoh sample project github di internet yang bisa kalian pelajari. Berikut library open source yg cukup populer seperti :
  1. https://github.com/greenrobot/EventBus
  2. http://square.github.io/otto/
  3. https://github.com/google/guava/wiki/EventBusExplained
Selamat Mencoba!

Sumber