天天看點

EventBus3.0使用總結1.注冊事件訂閱者2.構造發送消息類3.發送消息4.消息接收

在Android中,接口回調已經能夠處理掉大部分業務需求了,實在太變态的需求就用廣播也能夠完成,自己寫的性能好出問題也好解決。。。。。工作需要,不得不看看EventBus的用法,今天就來介紹一下學習經驗。

首先就是引入這個東東,我是直接在maven上下載下傳的jar包,下載下傳位址:

http://search.maven.org/#search|ga|1|g%3A%22de.greenrobot%22%20AND%20a%3A%22eventbus%22

下載下傳完成之後,拷貝到我們的項目之中就可以使用了。

1.注冊事件訂閱者

使用EventBus我們首先要注冊事件訂閱者,這個事件訂閱者就是說我們訂閱的事件一會要在哪裡進行處理,事件訂閱者的注冊和廣播注冊非常相似,有注冊,也有解除注冊,一般情況下,我們在Activity的onCreate()方法中進行注冊,在Activity的onDestory()方法中解除注冊。OK,代碼如下:

注冊:

EventBus.getDefault().register(this);
           

解除注冊:

EventBus.getDefault().unregister(this);
           

是以完整的代碼應該是這個樣子:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        EventBus.getDefault().register(this);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        EventBus.getDefault().unregister(this);
    }
           

2.構造發送消息類

注冊号事件訂閱者之後,第二步就是構造發送消息類,這個類就是我們要發送的對象,是以這個類怎麼寫都行,隻要你把要傳遞的東西能夠存進這個對象中又能夠從這個對象中拿出來就好。OK,我寫了一個簡單的消息類,如下:

public class MainMessage {
    private String msg;

    public MainMessage(String msg) {
        this.msg = msg;
    }

    public String getMsg() {
        return msg;
    }
}
           

說白了,就一個Java Bean。

3.發送消息

下來就是發送消息,發送消息也很簡單,代碼如下:

EventBus.getDefault().post(new MainMessage("Hello EventBus"));
           

就一行代碼,發送了一個EventBus對象,在構造這個對象的時候,在它的構造方法中傳入了一個參數,那就是Hello EventBus,如果你想要傳遞更多的消息内容,那麼你隻需要豐富這個MainMessage類就可以了。OK,那我們的消息發送到哪裡去了?

4.消息接收

最後一步,就是消息的接收,看看我們是怎麼接收消息的:

//主線程中執行
    @Subscribe(threadMode = ThreadMode.MainThread)
    public void onMainEventBus(MainMessage msg) {
        Log.d(TAG, "onEventBus() returned: " + Thread.currentThread());
    }
           

首先我定義了一個方法,這個方法名稱我可以随意取,沒有關系,這個方法有一個注解,@Subscribe,Subscribe本身的含義是訂閱,有了這個注解就說明這個方法就是用來響應EventBus發送的事件的,OK,這個注冊中還有一行代碼,

threadMode = ThreadMode.MainThread,這個又表示什麼意思呢?這個表示我們的這個方法在主線程中執行,除了在主線程中執行之外,還能在哪裡執行呢?看下面三個方法:
       
//背景線程
    @Subscribe(threadMode = ThreadMode.BackgroundThread)
    public void onBackgroundEventBus(BackgroundMessage msg) {
        Log.d(TAG, "onEventBusBackground() returned: " + Thread.currentThread());
    }

    //強制背景執行
    @Subscribe(threadMode = ThreadMode.Async)
    public void onAsyncEventBus(AsyncMessage msg) {
        Log.d(TAG, "onEventBusAsync() returned: " + Thread.currentThread());
    }

    //預設情況,和發送事件在同一個線程
    @Subscribe(threadMode = ThreadMode.PostThread)
    public void onPostEventBus(PostMessage msg) {
        Log.d(TAG, "onEventBusPost() returned: " + Thread.currentThread());
    }
           
ThreadMode.BackgroundThread表示讓該方法在背景執行,ThreadMode.Async也表示在背景執行,不同的是這裡表示消息發送方不必等待背景線程完就可以接着往下執行。最後一個ThreadMode.PostThread表示該方法和消息發送方在同一個線程中執行。 那麼針對這種不同類型的方法,我分别列印了日志,如下:
EventBus3.0使用總結1.注冊事件訂閱者2.構造發送消息類3.發送消息4.消息接收
很簡單吧。 好了,最後放出完整的代碼,如下:
public class MainActivity extends AppCompatActivity {

    private TextView tv;
    private final static String TAG = "EventBusTest";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv = ((TextView) findViewById(R.id.tv));
        EventBus.getDefault().register(this);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        EventBus.getDefault().unregister(this);
    }

    public void btnClick(View view) {
        switch (view.getId()) {
            case R.id.btn1:
                EventBus.getDefault().post(new MainMessage("Hello EventBus"));
                break;
            case R.id.btn2:
                EventBus.getDefault().post(new BackgroundMessage("Hello EventBus"));
                break;
            case R.id.btn3:
                EventBus.getDefault().post(new AsyncMessage("Hello EventBus"));
                break;
            case R.id.btn4:
                EventBus.getDefault().post(new PostMessage("Hello EventBus"));
                break;
        }
    }

    //主線程中執行
    @Subscribe(threadMode = ThreadMode.MainThread)
    public void onMainEventBus(MainMessage msg) {
        tv.setText(msg.getMsg());
        Log.d(TAG, "onEventBus() returned: " + Thread.currentThread());
    }

    //背景線程
    @Subscribe(threadMode = ThreadMode.BackgroundThread)
    public void onBackgroundEventBus(BackgroundMessage msg) {
        Log.d(TAG, "onEventBusBackground() returned: " + Thread.currentThread());
    }

    //強制背景執行
    @Subscribe(threadMode = ThreadMode.Async)
    public void onAsyncEventBus(AsyncMessage msg) {
        Log.d(TAG, "onEventBusAsync() returned: " + Thread.currentThread());
    }

    //預設情況,和發送事件在同一個線程
    @Subscribe(threadMode = ThreadMode.PostThread)
    public void onPostEventBus(PostMessage msg) {
        Log.d(TAG, "onEventBusPost() returned: " + Thread.currentThread());
    }
}
           

布局檔案:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Button
        android:id="@+id/btn1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="btnClick"
        android:text="發送消息到主線程執行"/>

    <Button
        android:id="@+id/btn2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="btnClick"
        android:text="發送消息到背景線程執行"/>

    <Button
        android:id="@+id/btn3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="btnClick"
        android:text="發送消息到背景線程強制執行"/>

    <Button
        android:id="@+id/btn4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="btnClick"
        android:text="發送消息--和發送方同一線程執行"/>

    <TextView
        android:id="@+id/tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"/>
</LinearLayout>
           

就這些。