サーチ…


構文

  • @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を引数として取得し、呼び出すスレッドで呼び出すメソッドを探します。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow