Android
GreenRobot EventBus
サーチ…
構文
- @Subscribe(threadMode = ThreadMode.POSTING)public void onEvent(EventClassイベント){}
パラメーター
スレッドモード | 説明 |
---|---|
ThreadMode.POSTING | イベントが投稿されたのと同じスレッドで呼び出されます。これがデフォルトモードです。 |
ThreadMode.MAIN | メインのUIスレッドで呼び出されます。 |
ThreadMode.BACKGROUND | バックグラウンドスレッドで呼び出されます。投稿スレッドがメインスレッドでない場合は、そのスレッドが使用されます。メインスレッドのEventBus 掲示されている場合は、それが使用する単一のバックグラウンドスレッドがあります。 |
ThreadMode.ASYNC | 独自のスレッドで呼び出されます。 |
イベントオブジェクトの作成
イベントの送受信には、最初にEventオブジェクトが必要です。イベントオブジェクトは実際には単純なPOJOです。
public class ArbitaryEvent{
public static final int TYPE_1 = 1;
public static final int TYPE_2 = 2;
private int eventType;
public ArbitaryEvent(int eventType){
this.eventType = eventType;
}
public int getEventType(){
return eventType;
}
}
イベントを受け取る
イベントを受け取るためには、クラスをEventBus
に登録する必要があります。
@Override
public void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
@Override
public void onStop() {
EventBus.getDefault().unregister(this);
super.onStop();
}
そしてイベントに登録します。
@Subscribe(threadMode = ThreadMode.MAIN)
public void handleEvent(ArbitaryEvent event) {
Toast.makeText(getActivity(), "Event type: "+event.getEventType(), Toast.LENGTH_SHORT).show();
}
イベントの送信
イベントを送信するのは、Eventオブジェクトを作成して投稿するのと同じくらい簡単です。
EventBus.getDefault().post(new ArbitaryEvent(ArbitaryEvent.TYPE_1));
単純なイベントを渡す
まず、EventBusをモジュールのgradleファイルに追加する必要があります。
dependencies {
...
compile 'org.greenrobot:eventbus:3.0.0'
...
}
今度はイベントのモデルを作成する必要があります。それは、私たちが渡したいものを含んでいます。今のところ空のクラスを作るだけです。
public class DeviceConnectedEvent
{
}
これで、EventBusに登録してイベントに登録するActivity
コードを追加できます。
public class MainActivity extends AppCompatActivity
{
private EventBus _eventBus;
@Override
protected void onCreate (Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
_eventBus = EventBus.getDefault();
}
@Override
protected void onStart ()
{
super.onStart();
_eventBus.register(this);
}
@Override
protected void onStop ()
{
_eventBus.unregister(this);
super.onStop();
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onDeviceConnected (final DeviceConnectedEvent event)
{
// Process event and update UI
}
}
このActivity
は、 onCreate()
メソッドでEventBus
インスタンスを取得します。 onStart()
/ onStop()
でイベントの登録/登録解除を行います。リスナーがスコープを失ったときに登録解除するか、 Activity
が漏洩する可能性があることを覚えておくことが重要です。
最後に、イベントで呼び出すメソッドを定義します。 @Subscribe
アノテーションはEventBusに、イベントを処理するためにどのメソッドを探すかを指示します。 @Subscribe
に登録するには@Subscribeで注釈されたメソッドを少なくとも1つ持つ必要があります。そうしないと例外がスローされます。注釈では、スレッドモードを定義します。これはEventBusにメソッドを呼び出すスレッドを通知します。これはバックグラウンドスレッドからUIスレッドに情報を渡す非常に便利な方法です!それがまさに私たちがここでやっていることです。 ThreadMode.MAIN
は、このメソッドがAndroidのメインUIスレッドで呼び出されるため、必要なUI操作を行うのは安全です。メソッドの名前は重要ではありません。 EventBusが探している@Subscribe
アノテーション以外の唯一の考えは、引数の型です。型が一致する限り、イベントがポストされたときに呼び出されます。
イベントを投稿するために最後に行う必要があります。このコードは当社のService
に含まれます。
EventBus.getDefault().post(new DeviceConnectedEvent());
それはすべてそこにある! EventBusはそのDeviceConnectedEventを受け取り、登録されているリスナーを調べ、登録したメソッドを調べ、DeviceConnectedEventを引数として取得し、呼び出すスレッドで呼び出すメソッドを探します。