Learn to Live and Live to Learn

IT(たまにビジネス)に関する記事を読んで、考えて、使ってみたことをまとめる場。

EventBusを使って簡単にCallbackを実現する

EventBusとは

あるClassでのイベントを検知して,別のClassで何かしたい時ありませんか?

Androidには簡単にそんなCallbackを実現する仕組みがあります.それがEventBusです.

例えば,ショッピングアプリの商品ページでお気に入りボタンが押された時,未ログインならログインページに飛ばし,ログイン完了後,再び商品ページに戻してお気に入り登録処理をしたい,なんて時に使えます(^^)

今回はgreenrobotのEventBusを使いますが,EventBusの提供元は一つではないです.

こちらにはsquere社のEventBusも紹介されています. qiita.com

実装

以下のgithubに載っていますが,EventBusは3stepで実現できちゃいます. github.com

今回は「ボタンがクリックされるとMessageEventというイベントが投げられ,MainActivityにToastを表示する」アプリを実装します.

イベントを投げるActivityも受けるActivityも同じなんで有難味がないかもしれませんが,簡略化のためそうします.

①イベント定義 (MessageEvent.java)

まず,ボタンがクリックされたことを通知するイベントClassを作ります.

MessageEvent.java

public class MessageEvent {
}

②イベントを監視する準備 (MainActivity.java)

次にイベントの監視を設定します.

通知を受け取りたいクラスのonStartにEventBus.getDefault().register(this);と書き

立つ鳥跡を濁さず,onStopではEventBus.getDefault().unregister(this);をして登録解除します.

③イベントを投げる (MainActivity.java)

最後に,イベントを発火したいタイミングでEventBus#getDefault#postします.

引数は発火したいイベントクラスです.

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

MainActivity.java

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

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

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                EventBus.getDefault().post(new MessageEvent());
            }
        });
    }

    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onMessageEvent(MessageEvent event) {
        Toast.makeText(this, "イベント発火", Toast.LENGTH_SHORT).show();
    }

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

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

build.gradleはこちら

compile 'org.greenrobot:eventbus:3.0.0'

簡単で便利なのでよかったら使ってみてくださーいノシ