傳遞一個簡單的事件

我們需要做的第一件事是將 EventBus 新增到我們模組的 gradle 檔案中:

dependencies {
    ...
    compile 'org.greenrobot:eventbus:3.0.0'
    ...
}

現在我們需要為我們的活動建立一個模型。它可以包含我們想要傳遞的任何內容。現在我們只是做一個空課。

public class DeviceConnectedEvent
{
}

現在我們可以將程式碼新增到我們的 Activity 中,該程式碼將向 EventBus 註冊並訂閱該事件。

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() 中的活動。重要的是要記得當你的聽眾失去範圍或你可能洩漏你的時候取消註冊 7。

最後,我們定義了我們想要用事件呼叫的方法。@Subscribe 註釋告訴 EventBus 它可以尋找哪些方法來處理事件。你必須至少有一個使用 @Subscribe 註釋的方法向 EventBus 註冊,否則它將丟擲異常。在註釋中我們定義了執行緒模式。這告訴 EventBus 呼叫該方法的執行緒。這是將資訊從後臺執行緒傳遞到 UI 執行緒的一種非常方便的方法! 這正是我們在這裡所做的。ThreadMode.MAIN 意味著將在 Android 的主 UI 執行緒上呼叫此方法,因此可以安全地在此處執行任何需要的 UI 操作。方法的名稱無關緊要。唯一的想法,即 eventBus 正在尋找的 @Subscribe 註釋的另一個是引數的型別。

釋出一個事件我們需要做的最後一件事。此程式碼將在我們的 Service 中。

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

這裡的所有都是它的! EventBus 將獲取該 DeviceConnectedEvent 並檢視其已註冊的偵聽器,檢視它們已訂閱的方法,並找到將 DeviceConnectedEvent 作為引數的方法,並在要呼叫它們的執行緒上呼叫它們。