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'
簡単で便利なのでよかったら使ってみてくださーいノシ